1

我创建了一个具有属性的自定义 UITabelViewCell:

@property (nonatomic, strong) UINavigationController *navigationController;

合成:

@syntethized navigationController = _navigationController

“建设者”:

+ (CustomCell *)cellForTableView:(UITableView *)tableView navigationController:(UINavigationController *)navigationController {
CustomCell *cell = (CustomCell *)[tableView dequeueReusableCellWithIdentifier:kCustomCellIdentifier];
if(cell == nil) {
    NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"AddressCell" owner:self options:nil];

    for (id currentObject in topLevelObjects)
        if ([currentObject isKindOfClass:[UITableViewCell class]]) {
            cell = (CustomCell *) currentObject;
            break;
        }
    }

    cell.navigationController = navigationController;

    return cell;
}

用方法:

- (IBAction)viewMapAction:(id)sender {
   MyViewController *controller = [[MyViewController alloc] initWithNibName:@"MyViewController" bundle:nil];
    [_navigationController pushViewController:controller animated:YES];
}

当我按下里面的按钮时CustomCell,导航控制器MyViewController会正常推动。里面MyViewController有一个MKMapView带有注释的,并且在viewDidAppar里面MyViewController [_mapView selectAnnotation:myAnnotation]已经调用了,但是没有显示一个标注(弹出)。如果我按下注释,标注也不会显示。

为什么?

如果我更改 my 的构造函数/属性CustomCell并传递目标/选择器而不是,并在 my 内部而不是在 my 中UINavigationController创建一个,则地图标注会正常显示。但是我会将所有单元格动作集中在单元格类中。viewMapActionUITableViewControllerCustomCell

4

1 回答 1

0

将所有细胞动作集中在细胞类中——这听起来不是一个好主意。请记住,表格视图单元格是视图,因此根据 MVC 模式,它们只是用户的界面。控制器应该处理视图中的操作,例如推送其他控制器。(根据我的经验,视图通常甚至不知道它们的控制器存在。)让当前视图控制器负责将其他视图控制器推到它上面更有意义,对吧?

因此,如果您想要一个设计友好的解决方案,请让您的表格视图控制器将cellForRowAtIndexPath. 单元类可以在构造函数方法中完成单元的所有其他初始化。但关键是,单元不必知道任何视图控制器。然后,使表格视图控制器成为单元格的委托(您必须创建此委托),并添加一个委托方法来处理按下地图按钮时推送新的视图控制器。

如果您担心可重用性,这种方法应该对您有好处。只要在需要这样的表格的地方插入表格视图控制器子类。或者,创建一个UITableViewController实现此功能的子类,然后针对您需要在其中呈现这些单元格的每种情况进一​​步子类该类。

我知道这不是解决您的地图标注问题的方法,但我认为您会发现,通过更好地规划的类结构,您可以完全避免这些晦涩的问题。希望这可以帮助!

于 2013-08-17T20:32:56.080 回答