如何从另一个类调用一个类委托方法

时间:2015-06-19 06:55:44

标签: ios objective-c swift uitableview

在表格列表中使用swift这里我想在另一个类视图控制器中加载一个类表列表,这个概念在objective-c中工作但是归结为swift委托方法没有调用我的目标-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

MaindView.h

#import <UIKit/UIKit.h>

@interface ViewController1 : UIViewController

@end

MaindView.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它正在调用但是委托方法没有在后台类中调用,即它在swift表列表中显示空视图控制器没有正确加载请帮助我,这是我的快速代码

BackGroundView.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()
    }
}

Mainview.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()
    }
 }

3 个答案:

答案 0 :(得分:2)

[增订] 你没有在mainview.swift中初始化BackGroundView。你只是为对象分配内存。请注意,您在Objective-C中分配和初始化一个类。在Swift中,你必须使用Class.alloc()。initialize()做同样的事情。但是,swift已用一个简单的调用替换了那段冗长的代码:Class()

目标-C:

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

夫特:

var myInstance = Class()

其他一些事情:

  • 在你之后调用tableView.reloadData()总是一个好主意 更改其中的信息(如在TableViewAdding中)。
  • 硬编码数字(如表视图大小)绝不是一个好主意。
  • TableViewAdding看起来像一个类方法。 tableViewAdding将更准确地遵循camelCase约定

使用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

答案 1 :(得分:1)

  1. 使用KVC获取委托属性。
  2. 使用NSInvocation调用委托方法

答案 2 :(得分:1)

在Mainview.swift中将total声明为Class变量。不要使用.alloc()

import UIKit

class Mainview: UIViewController{

  var total = BackGroundView()
  @IBOutlet var myview1: UIView!

  override func viewDidLoad() {
      super.viewDidLoad()

      total.TableViewAdding(self.view)
  }
  override func didReceiveMemoryWarning() {
      super.didReceiveMemoryWarning()
  }
}