2013-04-01 69 views
1

我有一個UITableViewController類,我稱之爲「MasterViewController」。 從MasterViewController中,我想顯示一個使用不同的UITableViewController(而不是MasterViewController)的tableview。我這樣做是因爲另一個tableview已經使用MasterViewController作爲它的委託和數據源。UITableViewController委託

我在MasterViewController的方法中有以下邏輯;

ToTableViewController *toController = [[ToTableViewController alloc] init]; 
UIView *toView = [[UIView alloc] initWithFrame:CGRectMake(10,10,250,200)]; 
//toView.backgroundColor = [UIColor redColor]; 
UITableView *toTableView = [[UITableView alloc] initWithFrame:CGRectMake(10,10,220,180) style:UITableViewStylePlain]; 

[toTableView setDelegate:toController]; 
[toTableView setDataSource:toController]; 

[toView addSubview:toTableView]; 

[self.view addSubview:toView]; 

[toTableView reloadData]; 

我想ToTableViewController成爲這個新的tableview(toTableView)的委託和數據源。

問題是我的ToTableViewController cellForRowAtIndexPath方法沒有被調用。事實上,沒有任何委託方法被調用。

任何反饋將不勝感激。

回答

0

我敢肯定你的問題是,toController被釋放得太早。使用ARC(我假設你也是),我會在你嘗試完成之後玩弄它。我得到了相同的結果,委託方法似乎沒有被調用。什麼解決了它是不使用局部變量的toController。相反聲明爲一個構件到MasterViewController類等

@property (strong, nonatomic) ToTableViewController *toController; 

然後使用變量名_toController引用它在代碼中。

編輯:只是爲了清楚我的第一次測試我有ToTableViewController從UITableViewController繼承。既然如此,我真的不需要添加的UITableView你也創建並附加委託(你可以直接使用_toController.view)所以在第二次測試中,我創建了一個ToTableViewController從頭開始繼承委託協議, UITableView變得必要。只是爲了完整性這裏是工作的代碼:

ToTableViewController.h

#import <Foundation/Foundation.h> 

@interface ToTableViewController : NSObject <UITableViewDelegate, UITableViewDataSource> 

@end 

ToTableViewController.m

#import "ToTableViewController.h" 

@implementation ToTableViewController 

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 
{ 
    return 1; 
} 

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{ 
    return 13; 
} 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *CellIdentifier = @"Cell"; 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) { 
     cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; 
    } 

    NSString *str1 = @"Row #"; 
    cell.textLabel.text = [str1 stringByAppendingFormat:@"%d", indexPath.row+1]; 

    return cell; 
} 

@end 

MasterViewController.m(我在.m文件聲明toController如圖所示,但可以這樣做.h文件,而不是...)

#import "MasterViewController.h" 
#import "ToTableViewController.h" 

@interface MasterViewController() 

@property (strong, nonatomic) ToTableViewController *toController; 

@end 

@implementation MasterViewController 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    _toController = [[ToTableViewController alloc] init]; 
    UIView *toView = [[UIView alloc] initWithFrame:CGRectMake(10,10,250,200)]; 
    toView.backgroundColor = [UIColor redColor]; 

    UITableView *toTableView = [[UITableView alloc] initWithFrame:CGRectMake(10,10,220,180) style:UITableViewStylePlain]; 

    [toTableView setDelegate:_toController]; 
    [toTableView setDataSource:_toController]; 

    [toView addSubview:toTableView]; 

    [self.view addSubview:toView]; 
} 

@end 
+0

jross,感謝您花時間來幫助我。這似乎工作。有趣的是,我最初不得不將控制器聲明爲MasterViewController的屬性,並且遇到了同樣的問題。我按照你的建議把它移回去了,它正在工作。也許在我上一次xCode會議期間某些東西被損壞了。無論如何,這已經解決了我的問題。非常感謝。 Tim –

+0

@TDavey,因爲我一直在學習iOS,所以你的問題讓我感興趣,因爲我一直在試驗w /類似的情況。 – jross