如何生成通用表视图控制器?

时间:2012-04-22 14:02:28

标签: objective-c cocoa-touch uitableview

我已经创建了一个自定义 TablePickerViewController ,它是 UITableViewController 的子类。我正在使用此类显示自定义类型 TablePickerItem 的对象列表。

我在iOS应用程序中多次使用 TablePickerViewController 来显示用户必须选择项目的不同类型的列表 - 然后是另一个视图控制器 MainViewController 应该对这个选择做出反应并做点什么。

我已经创建了这个协议,并在 TablePickerViewController 中创建了一个委托属性:

@protocol TablePickerViewControllerDelegate <NSObject>
- (void)tablePickerViewController:(TablePickerViewController *)controller
                    didSelectItem:(TablePickerItem*)item;
@end

当我在 MainViewController 中设置新的 TablePickerViewController 时,它也被设置为委托 - 而当用户点击表格视图中的单元格时会通知它。 / p>

问题是我的 MainViewController 会使用不同的数据( TablePickerItem )设置多个 TablePickerViewController 。我应该如何设置我的 MainViewController 来处理这些多个 TablePickerViewController ?来自每个事件的事件将导致在我的 MainViewController 中调用相同的协议方法。

此外,我需要获取 TablePickerItem 所代表的元素,因为我需要知道在tablePickerViewController:didSelectItem方法中执行时的元素ID。我应该通过向 TablePickerItem 添加@property (nonatomic) id element之类的内容来处理此问题,并将原始对象设置为此属性然后创建它吗?

如果我的解决方案似乎以错误的方式完成,也许有人可以给我一个关于如何创建通用表视图控制器的示例。

1 个答案:

答案 0 :(得分:0)

我不完全确定你的设置,但是如果你有多个选择器反馈到主控制器,那么你可以只提到一个选择器,例如。

// MainViewController.m

@interface MainViewController ()

@property (nonatomic, strong) TablePickerViewController *picker1;
@property (nonatomic, strong) TablePickerViewController *picker2;
// ... and so on. Obviously you know your problem domain so you can change
// the terrible naming above to something appropriate

@end

@implementation MainViewController


// ...

- (void)theMethodWhereYouSetUpYourPickers;
{
    TablePickerViewController *picker1 = [[TablePickerViewController alloc] init];
    picker1.delegate = self;
    self.picker1 = picker1;
    // ...
}

- (void)tablePickerViewController:(TablePickerViewController *)controller
                didSelectItem:(TablePickerItem*)item;
{
    if (controller == self.picker1) {
         NSLog(@"Something was picked in picker 1 %@", item);
    } else if (controller == self.picker2) {
         NSLog(@"Something was picked in picker 2 %@", item);
    }
}

// ...

@end