gpt4 book ai didi

ios - 如何从一个类调用另一个类的委托(delegate)方法

转载 作者:搜寻专家 更新时间:2023-10-31 22:22:36 26 4
gpt4 key购买 nike

在此处使用 swift 的表列表中,我想在另一个类 View Controller 中加载一个类表列表,这个概念在 objective-c 中有效,但归结为 swift 委托(delegate)方法不调用我的 objective -c@swift 代码下面请帮我一些人

BackGroundView.h:-

#import <UIKit/UIKit.h>
@interface BackGroundView

UIViewController<UITableViewDataSource,UITableViewDelegate>
{
UITableView *tableView;
}
@property(nonatomic, retain) UITableView *tableView;
-(void)tableList:(UIView *) view1;
@end

BackGroundView.m:-

#import "BackGroundView.h"
@interface BackGroundView ()
{
NSArray * Mainarray;
}
@end
@implementation BackGroundView
@synthesize tableView;
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
}

-(void)tableList:(UIView *) view1
{
Mainarray = [[NSArray alloc]initWithObjects:@"india",@"australia",@"usa", nil];

tableView=[[UITableView alloc]init];
tableView.frame = CGRectMake(0,0,320,400);
tableView.dataSource=self;
tableView.delegate=self;
tableView.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
[tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"Cell"];
[tableView reloadData];
tableView.separatorColor = [UIColor blackColor];
self.tableView.tableFooterView = [[UIView alloc] initWithFrame:CGRectZero];
[view1 addSubview:tableView];
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return Mainarray.count;
}
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
return 1;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath] ;

if (cell == nil)
{
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}
cell.textLabel.text= [Mainarray objectAtIndex:indexPath.row];

return cell;
}

-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
if ([cell respondsToSelector:@selector(setSeparatorInset:)]) {
[cell setSeparatorInset:UIEdgeInsetsZero];
}
if ([cell respondsToSelector:@selector(setPreservesSuperviewLayoutMargins:)]) {
[cell setPreservesSuperviewLayoutMargins:NO];
}
if ([cell respondsToSelector:@selector(setLayoutMargins:)]) {
[cell setLayoutMargins:UIEdgeInsetsZero];
}
}
@end

主视图.h

#import <UIKit/UIKit.h>

@interface ViewController1 : UIViewController

@end

主视图.m

#import "ViewController1.h"
#import "BackGroundView.h"

@interface MaindView ()
{
BackGroundView * v1;
}

@end

@implementation MaindView

- (void)viewDidLoad {
[super viewDidLoad];
v1 = [[BackGroundView alloc]init];
// Do any additional setup after loading the view.
[v1 tableList:self.view];
}

- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end

现在它在 objective-c 中工作正常并且表列表加载正常

归结为 swift ios:-

现在我正在从 Mainview 类调用 TableViewAdding 到 BackgroundView 它正在调用,但是委托(delegate)方法没有在后台类中调用,即它在 swift 表列表中显示空 View Controller 未正确加载请帮助我,这是我的 swift 代码

背景 View .swift

import UIKit
class BackGroundView: UIViewController,UITableViewDelegate, UITableViewDataSource {

var tableView: UITableView = UITableView()
var items = NSArray ()

override func viewDidLoad() {
super.viewDidLoad()
}

func TableViewAdding(myview:UIView)
{
items = ["india","australia","usa"];
println(items)
tableView.frame = CGRectMake(0, 50, 320, 200);
tableView.delegate = self
tableView.dataSource = self
tableView.registerClass(UITableViewCell.self, forCellReuseIdentifier: "cell")
myview.addSubview(tableView)
}

func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
println("numberOfRowsInSection")
return self.items.count
}

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

println("cellForRowAtIndexPath")

var cell:UITableViewCell = tableView.dequeueReusableCellWithIdentifier("cell") as UITableViewCell

cell.textLabel?.text = self.items.objectAtIndex(indexPath.row) as NSString

return cell
}

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath){
println("in first")
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
}

主视图.swift

import UIKit

class Mainview: UIViewController{

@IBOutlet var myview1: UIView!

override func viewDidLoad() {
super.viewDidLoad()

var total = BackGroundView.alloc()
total.TableViewAdding(self.view)
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
}

最佳答案

[更新]您没有在 mainview.swift 中初始化 BackGroundView。您只是在为对象分配内存。请注意,您在 Objective-C 中分配并初始化了一个类。在 Swift 中,你必须对 Class.alloc().initialize() 做同样的事情。然而,swift 已经用一个简单的调用取代了冗长的代码行:Class()

objective-C :

Class *myInstance = [[Class alloc] init];

swift :

var myInstance = Class()

一些其他的东西:

  • 在您之后调用 tableView.reloadData() 总是一个好主意更改其中的信息(如在您的 TableViewAdding 中)方法。
  • 硬编码数字(例如表格 View 大小)从来都不是一个好主意。
  • TableViewAdding 看起来像一个类方法。 tableViewAdding 会更准确地遵循驼峰命名法

为什么使用 var myInstance = Class.alloc() 与使用 var myInstance = Class() 不同的文档可以在 Apple 的 NSObject 中找到 创建、复制和取消分配对象下的文档

https://developer.apple.com/library/prerelease/ios/documentation/Cocoa/Reference/Foundation/Classes/NSObject_Class/index.html#//apple_ref/occ/clm/NSObject/alloc

关于ios - 如何从一个类调用另一个类的委托(delegate)方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30931821/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com