How to call methods of a class delegate from another class

On a table list using swift here I want to load a table list of one class into another class view controller and this concept works in objective-c, but come to swift delegate methods that don't call my object code -c @swift below please help me something else

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

      

Now it works fine in objective-c and the table list loads fine

go down to fast ios: -

Now I am calling TableViewAdding from the Mainview class in the BackgroundView, but I am calling but the delegate methods are not called in the background class i.e. it shows empty view controller in swift table list, not loading correctly, please help me and this is my swift code

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


source to share


3 answers


[UPDATED] You are not initializing the BackGroundView in mainview.swift. You are just allocating memory for the object. Note that you both assign and run the class in Objective-C. In Swift, you need to do the same with Class.alloc (). Initialize (). However, swift has replaced this verbal line of code with a simple call: Class ()

Objective-C:

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

      

Swift:

var myInstance = Class()

      



Some other things:

  • It's always a good idea to call tableView.reloadData () after you change the information in it (for example, in your TableViewAdding method).
  • It is never a good idea to write down hardcodes (such as table view size).
  • TableViewAdding looks like a class method. tableViewAdding will more closely follow the camelCase convention

Documentation on why usage is var myInstance = Class.alloc()

not the same as usage var myInstance = Class()

can be found in Apple's NSObject documentation under Creating, Copying, and Freeing Objects

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

+2


source


  • Using KVC to get the delegation property.
  • Using the NSInvocation Method to Call a Delegate Method


+1


source


Declare the total as a class variable in Mainview.swift. Don't use .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()
  }
}

      

+1


source







All Articles