如何使UIViewController成为单独的UITableViewController的委托?

时间:2011-02-16 09:53:58

标签: iphone cocoa-touch ios4

我有一个UITabBarController,它的一个标签上有一个UINavigationController。然后,UINavigationController将自定义UIViewController作为其主视图。

基于由自定义UIViewController中的按钮触发的IBAction,我将UITableView控制器推送到UINavigationController堆栈上,就像这样。 (注意:这些只是实际代码的片段)。

主UIViewController的头文件:

@interface ATMs : UIViewController <CLLocationManagerDelegate, NSFetchedResultsControllerDelegate, MKMapViewDelegate> {
}
- (IBAction) showLocationList;
@end  

主UIViewController的实现文件:

@implementation ATMs
- (void)showLocationList {

    LocationList *locationTableController = [[LocationList alloc] initWithNibName:@"LocationList" bundle:nil];

    [self.navigationController pushViewController:locationTableController animated:YES];
    [locationTableController release];

}

locationTableController视图控制器为核心数据提取对象列表并将其显示在表上。当用户选择一行时,我希望发生以下事情:

  • 弹出导航控制器上的locationTableController,以便我的ATMs视图控制器可见
  • 调用ATMs中的方法,传入locationTableController中点击的行所代表的对象

我尝试使用[locationTableController setDelegate:self];showLocationList的{​​{1}}位于我alloc UITableViewController的下方,并将UITableViewDelegate添加到ATMs的标题中。
但是,当我执行上述操作时,出现构建错误,指出locationTableController可能无法响应setDelegate

2 个答案:

答案 0 :(得分:2)

简单来说,在不检查其余代码的情况下,您需要实例化UITableViewController并将其tableView(而不是TableViewController)委托设置为self。

然后你可以在你的ATM UIViewController中实现- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath,并在tableView中选择一行后调用它。

我还会根据下面的代码以模态方式呈现你的tableViewController,并将其声明为实例变量,以便在调用tableview委托方法时将其解除:

@class LocationList
@interface ATMs : UIViewController
{
   LocationList *locationTableController
   ...
}

在您的实施中:

@implementation ATMs
...
- (void)showLocationList 
{
    locationTableController = [[LocationList alloc] initWithNibName:@"LocationList" bundle:nil];
    locationTableController.tableView.delegate = self;
    [self presentModalViewController:locationTableContrller animated:YES];
    [locationTableController release];
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    [locationTableController dismissModalViewControllerAnimated:YES];
    // Rest of your implementation code here
}

答案 1 :(得分:0)

这可以通过以下各种方法实现: -

  1. 委托模式
  2. 通知
  3. 通过使用类方法(getter / setters),在ATM控制器中,在其他一些管理器类中使用
  4. 关键价值观察。
  5. 但我认为最好的方法是创建自己的委托方法,并在LocationList中选择行时发送回调,以及您在ATM控制器上所需的数据