Splitviewcontroller с двумя табличными представлениями, проблема делегата - PullRequest
1 голос
/ 27 сентября 2011

У меня есть то, что кажется основным требованием. Я делаю приложение iPad для splitview, используя шаблон xcode 4. Я хочу, чтобы моим корневым контроллером представления было табличное представление, заполненное языками, а моим подробным представлением - еще одно представление таблицы, которое обновляется каждый раз, когда пользователь выбирает язык слева. Проблема в том, что когда пользователь выбирает язык слева в корневом представлении, my [tableView reloadData]; Функция в подробном виде не работает, т.е. делегаты tableView не вызывают. Мне нужно, чтобы когда пользователь выбирал язык, tableView обновлялся.

Вот код, который у меня сейчас есть: RootViewController.m

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{

DetailViewController *detObj = [[DetailViewController alloc] init];

detObj.detailItem = [self.tableArray objectAtIndex: indexPath.row];
NSLog(@"Selected Item %@", [self.tableArray objectAtIndex: indexPath.row]);

}

DetailViewController.m

- (void)setDetailItem:(id)newDetailItem
{
NSLog(@"setDetailItem Called");
if (_detailItem != newDetailItem) {
    [_detailItem release];
    _detailItem = [newDetailItem retain];
    self.title = _detailItem; 
    NSLog(@"Detail Item %@", _detailItem);

    // Update the view.
    //[self testAction:self];
    [self configureView];
}

if (self.popoverController != nil) {
    [self.popoverController dismissPopoverAnimated:YES];
}       


}

- (void)configureView
{
// Update the user interface for the detail item.
[tableView setDataSource:self];
[tableView setDelegate:self];
NSLog(@"Configure");
[self.tableView reloadData];

}
#pragma mark - Split view support

- (void)splitViewController:(UISplitViewController *)svc willHideViewController:(UIViewController *)aViewController withBarButtonItem:(UIBarButtonItem *)barButtonItem forPopoverController: (UIPopoverController *)pc
{
barButtonItem.title = @"Languages";
NSMutableArray *items = [[self.toolbar items] mutableCopy];
[items insertObject:barButtonItem atIndex:0];
[self.toolbar setItems:items animated:YES];
[items release];
self.popoverController = pc;
}

// Called when the view is shown again in the split view, invalidating the button and popover controller.
- (void)splitViewController:(UISplitViewController *)svc willShowViewController:(UIViewController *)aViewController invalidatingBarButtonItem:(UIBarButtonItem *)barButtonItem
{
NSMutableArray *items = [[self.toolbar items] mutableCopy];
[items removeObjectAtIndex:0];
[self.toolbar setItems:items animated:YES];
[items release];
self.popoverController = nil;
}

#pragma mark - Table view data source

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
NSLog(@"DETAIL numberOfSectionsInTableView Called");
#warning Potentially incomplete method implementation.
// Return the number of sections.
return 2;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
#warning Incomplete method implementation.
// Return the number of rows in the section.
if(section == 0){
    return 2;
}
return 1;
}

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {

if (section == 0) {
    return @"Documents";
}
else if (section == 1){
    return @"Video";
}
}

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
return 100;

}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"Cell";

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
}

// Configure the cell...
cell.textLabel.text = @"Cell";

return cell;
}

Кстати, все эти журналы работают правильно (за исключением одного в методе делегата tableView), и я установил делегаты для обоих таблиц в IB, в .h и .m. В качестве теста я настроил кнопку в файле nib detailView с IBAction следующим образом:

- (void)testAction:(id)sender {
NSLog(@"Test CAlled");
[self.tableView reloadData];
}

и это работает. Что происходит?

1 Ответ

2 голосов
/ 27 сентября 2011

В - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath вы должны обновить текущий DetailViewController, а не делать новый.Это подход, которому вы должны следовать при использовании разделения вида.Таким образом, вы должны заменить alloc + init:

DetailViewController *detObj = [[DetailViewController alloc] init];

на

DetailViewController *detObj = self.currentDetailViewController;

, где self.currentDetailViewController должно указывать на текущий левый вид в режиме разделения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...