2013-08-24 4 views
4

Я создаю приложение для iPad. Корневой UITableview имеет элемент правой кнопки панели в навигационном контроллере. Когда вы нажимаете кнопку, на дисплее появляется надпись. Popover - это UITableViewController. Когда вы нажимаете ячейку в popover, как я могу передавать данные в этой ячейке и вставлять ее в ячейку в корневой UITableview? Я искал документы Apple и не мог найти то, что мне нужно. Может ли кто-нибудь подтолкнуть меня в правильном направлении?Как вставить ячейку в UITableViewController

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

Какой результат вы получите с текущим кодом? Выполняется ли этот оператор - [_delegate selectedObject: _currentObject] ;? Вы вошли в систему? Как контроллер представления корневой таблицы задал себя как делегат Popover? – rdelmar

ответ

1

Я понял. Надеюсь, я помогу кому-нибудь. Сначала я объясню код, а затем разместим его ниже. В принципе, я установил источник данных в представлении корневой таблицы «ObjectSelect», как NSMutableArray, называемый «currentObjectArray». ObjectSelect также является ObjectSelectPopoverDelegate. В основном, когда ячейка в popover используется, она добавляет объект, постучанный в «currentObjectArray», и перезагружает таблицу.

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.м

-(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

Вот некоторые хороший код, чтобы использовать, которые могут быть в состоянии помочь вам.

- (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; 
} 

Надеюсь, это вам поможет.

+0

Я знаю, как заполнять ячейки, я просто не знаю, как заполнять ячейки при действии, когда клетки popover используются. –

+0

Где находятся данные в ячейках? – jake1k

+0

из метода делегата, это единственный объект, объект, который был использован в popover. –

0

Я думаю, что у вас должно быть имущество с именем, отличным от delegate, в вашем контроллере popover, поскольку UITableViewController уже имеет свойство delegate для протокола UITableViewDelegate; может быть masterTable или что-то в этом роде.

Затем в реализации selectedObject: в корневом UITableView вы можете сделать строку вставки или добавить ее в массив данных и в таблицу reload.

К сожалению, мой плохой ... @geraldWilliam прав, UITableViewController не обладает свойством делегата ...

То, что вам кажется, что он должен работать ... Так что делает selectedObject: метод получения вызван в делегат? Если да, что вы делаете в этом методе? Если вы добавите объект в набор данных (массив или словарь или базу данных) для корневого представления, вставьте строку в ее таблицу (или перезагрузите данные), она должна работать.

Вот код, который работает для меня. Это не из пирог, но с толкаемомом зрения, но нет никаких оснований, что должно сделать разницу:

- (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]; 

}

+0

UITableView имеет свойство делегата. UITableViewController этого не делает. – geraldWilliam

1

Вы добавляете данные из выбранной ячейки к источнику данных делегату главного стола.

Затем этот источник данных должен указать основной таблице, что ячейка была вставлена ​​по пути указателя.

Смежные вопросы