我不知道这是否被认为是一种公认的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];
也许我还需要一个额外的插座?
我必须在那里,但我只是看不到我仍然缺少的东西。谁能帮我?谢谢!
答案 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];