我正在创建一个iPad应用。根UITableview在导航控制器中有一个右栏按钮项。点击按钮时,它会显示一个弹出控制器。 popover是一个UITableViewController。当你点击popover中的一个单元格时,我如何传递该单元格中的数据并将其插入到UITableview根目录的单元格中?我搜索了Apple文档,找不到我需要的东西。任何人都可以把我推向正确的方向吗?
Roottable.h
@interface Roottable : UITableViewController<PopoverDelegate>
Popover.h
@protocol AthleteSelectPopoverDelegate <NSObject>
@required
-(void)selectedObject:(Object *)newObject;
@end
@property (nonatomic, weak) id<PopoverDelegate> delegate;
@property (readwrite, nonatomic) Object *currentObject;
@end
popover.m
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
_currentObject = [_objectArray objectAtIndex:indexPath.row];
//Notify the delegate if it exists.
if (_delegate != nil) {
[_delegate selectedObject:_currentObject];
}
}
答案 0 :(得分:1)
您可以将所选单元格中的数据添加到主表的数据源代理中。
然后该数据源应该告诉主表在索引路径中插入了一个单元格。
答案 1 :(得分:1)
我明白了。希望我帮助别人。我先解释一下代码然后在下面发布。基本上,我将根表视图的数据源“ObjectSelect”设置为名为“currentObjectArray”的NSMutableArray
。 ObjectSelect也是ObjectSelectPopoverDelegate。基本上,当点击弹出窗口中的单元格时,它会将点击的对象添加到“currentObjectArray”并重新加载tableview。
ObjectSelect.h
#import <UIKit/UIKit.h>
#import "ObjectSelectPopover.h"
@interface ObjectSelect : UITableViewController<ObjectSelectPopoverDelegate>
@property (nonatomic, strong) ObjectSelectPopover *objectPicker;
@property (nonatomic, strong) UIPopoverController *objectPickerPopover;
@property (readwrite, nonatomic) Object *currentObject;
@property (nonatomic, strong) NSMutableArray *selectedObjectArray;
@end
ObjectSelect.m
-(void)selectedObject:(Object *)newObject
{
_currentObject = newObject;
if(!_selectedObjectArray){
_selectedObjectArray = [[NSMutableArray alloc] init];
}
if([_selectedObjectArray containsObject:_currentAthlete]){
//lol you don't get added, bub
}
else{
[_selectedObjectArray addObject:_currentObject];
}
[self.tableView reloadData];
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
Object *objectTapped = (Object *)[_objectAthleteArray objectAtIndex:indexPath.row];
return cell;
}
ObjectSelectPopover.h
#import <UIKit/UIKit.h>
#import "Object.h"
@protocol ObjectSelectPopoverDelegate <NSObject>
@required
-(void)selectedObject:(Object *)newObject;
@end
@interface ObjectSelectPopover : UITableViewController
@property (nonatomic, weak) id<ObjectSelectPopoverDelegate> delegate;
@property (nonatomic, strong) NSMutableArray *objectArray;
@property (readwrite, nonatomic) Object *currentObject;
@end
ObjectSelectPopover.m
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
_currentObject = [_objectArray objectAtIndex:indexPath.row];
//Notify the delegate if it exists.
if (_delegate != nil) {
[_delegate selectedObject:_currentObject];
}
[self.tableView deselectRowAtIndexPath:indexPath animated:YES];
}
答案 2 :(得分:0)
我认为你的popover控制器中应该有一个名称不是delegate
的属性,因为UITableViewController
已经拥有delegate
协议的UITableViewDelegate
属性;也许是masterTable
或其他什么。
然后在根UITableView的selectedObject:
实现中,您可以执行插入行或将其添加到数据数组并reload
表。
哎呀,我的坏...... @geraldWilliam是对的,UITableViewController没有委托属性......
你有什么似乎应该工作......那么在委托中调用 selectedObject:方法?如果是这样,你用这种方法做什么?如果将对象添加到根视图的数据集(数组或字典或数据库)中,在其tableview中插入一行(或重新加载数据),它应该可以工作。
这是一些适合我的代码。它不是来自弹出窗口,而是来自推动视图,但没有理由应该有所作为:
- (ThingStatus) thingPicker: (ThingPickerTableViewController *) thingPicker didSelectThing: (Thing *) thing {
NSLog( @"Entering %s", __func__ );
// Dismiss the pushed view controller (for you, the popover)
[self.navigationController popViewControllerAnimated: YES];
NSArray *startingList = self.currentCellObjectList;
[self.databaseManager addThing: thing];
NSArray *endingList = self.databaseManager.thingsForTableView;
// Figure out the differences adding made...
DiffResult *changes = [startingList simpleDiffWithArray: endingList];
NSLog( @"%d deletions, %d insertions", changes.deletionCount, changes.insertionCount );
// I only handle insertions in this code... deletions would be similar
__block NSUInteger objIdx = 0;
NSMutableArray *changeableThingList = [startingList mutableCopy];
[changes.insertionIndexes enumerateIndexesUsingBlock: ^( NSUInteger idx, BOOL *stop ) {
NSLog( @" - insert %@ at %d", [[changes.insertionObjects objectAtIndex: objIdx] name], idx );
NSIndexPath *indexPath = [NSIndexPath indexPathForRow: idx inSection: 0];
[changeableThingList insertObject: [changes.insertionObjects objectAtIndex: objIdx] atIndex: idx];
self.currentCellObjectList = changeableThingList;
[self.tableView insertRowsAtIndexPaths: [NSArray arrayWithObject: indexPath] withRowAnimation: UITableViewRowAnimationRight];
++objIdx;
}];
[self.databaseManager save];
return [self.databaseManager: thingStatus];
}
答案 3 :(得分:-2)
以下是一些可以帮助您的好代码。
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
// Return the number of rows in the section.
return self.item.count;
}
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];
}
//Get the row
Sport *rowSport = self.sports[indexPath.row];
cell.textLabel.text = rowItem.itemName;
cell.detailTextLabel.text = rowItem.section;
return cell;
}
我希望这会对你有所帮助。