UITableCell和UIViewController之间的可见性

时间:2014-01-13 16:51:00

标签: ios objective-c uitableview

我不知道这是否被认为是一种公认​​的Objective-C实践,所以我对其他想法持开放态度。这是个主意。我有一个表来自自定义UITableViewCell的单元格。这些单元格中的每一个都呈现用户可以参加的事件。因此,我希望用户能够直接从表格视图中将它们添加到日历中。

为了做到这一点,我在每个表格单元格上放了一个按钮 - 一个“添加到日历按钮”。我坚持的是如何将此按钮的动作连接回UIViewController,其中UITableView是子视图。该按钮是UITableView类的一部分,并且没有UIViewController的可见性。

我一直在努力实现下面Aaron建议的委托模式。我差不多了,但还是有些东西断了。这就是我所拥有的:

新协议EventDelegate.h

@protocol EventDelegate <NSObject>
- (void) addToCalendar : (NSString *) strDate;
@end

MyTableCell.h中,我添加了此属性:

@property (nonatomic, strong) id<EventDelegate> eventDelegate;

MyTableCell.m中,我添加了此方法:

- (IBAction)addToCalendar:(UIButton *)sender
{
    NSLog(@"calling addToCalendar delegate %@", _dayAndTime.text);
    [self.eventDelegate addToCalendar:_dayAndTime.text];
}

一切都很顺利。当我点击我添加到表格单元格的按钮时,我得到输出calling addToCalendar delegate Monday, January 13

MyViewController.h中,我将其更改为:

@interface TrainingScheduleViewController : UIViewController <UITableViewDelegate, UITableViewDataSource, EventDelegate>
- (void) addToCalendar:(NSString *)strDate;
@end

最后,在MyViewController.m中我添加了方法体:

- (void) addToCalendar:(NSString *)strDate
{
    NSLog(@"inside delegate");
    NSLog(@"%@", strDate);
}

我认为可能是问题的部分是Aaron建议添加这行代码的地方:

[tableViewController setEventDelegate:self];

首先,我不确定在哪里添加此行。我把它放在viewDidLoad中。编译器不会让我逐字输入,所以我能找到的最接近的就是这一行:

[self.tableView setDelegate:self];

也许我还需要一个额外的插座?

我必须在那里,但我只是看不到我仍然缺少的东西。谁能帮我?谢谢!

2 个答案:

答案 0 :(得分:0)

以下是我从“cellForRowAtIndexPath”方法中提取的一些示例代码。这是一个在IB中构建并使用原型单元格的表格,但无论您如何实现,这个想法都是一样的。在这种情况下,我使用标签来标识按钮,然后在创建单元格时引用它:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath];

    UIButtonRed *actionButton = (UIButtonRed *)[cell.contentView viewWithTag:4];
    [actionButton addTarget:self action:@selector(initializeReorder:) forControlEvents:UIControlEventTouchDown];

    return cell;
}

initializeReorder:方法自动接收(id)sender作为参数。您可以将其强制转换为表格单元格并检查它以获取其余信息:

- (void)initializeReorder:(id)sender
{
    UIButtonRed *actionButton = (UIButtonRed*)sender;
    UITableViewCell *cell = (UITableViewCell*)actionButton.superview.superview;    
    NSIndexPath* cellPath = [self.tableView indexPathForCell:cell];
    ...
}

答案 1 :(得分:0)

为此创建协议。

我会定义一个这样的协议:

@protocol MyEventDelegate <NSObject>
- (void)addToCalendar:(Event*)event;
@end

并为您的UITableViewController课程和MyTableCell课程添加委托属性:

@property (nonatomic, strong) id<MyEventDelegate> eventDelegate;

MyViewController应符合此协议并实施addToCalendar:

@interface MyViewController : UIViewController <MyEventDelegate>

当您的MyViewController对象设置UITableViewController时,请传入对自身的引用:

[tableViewController setEventDelegate:self];

当您的UITableViewController创建每个单元格时,请将其传递给:

[cell setEventDelegate:self.eventDelegate];

现在,当您的单元格中调用IBAction时,单元格可以在MyViewController上调用委托方法,如下所示:

[self.eventDelegate addToCalendar:event];