Передача int из MasterView в DetailView в UISplitViewController - PullRequest
0 голосов
/ 29 марта 2012

У меня есть UISplitViewController, в котором я пытаюсь передать значение int из MasterViewController в DetailTableViewController. И мастер, и контроллер подробного представления являются UITableViewControllers. Я пытаюсь передать значение indexPath.row от мастера к детали, которая будет определять, какой массив объектов загружается в табличное представление detailViewController.

Некоторый код из MasterViewController.m

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
int indexRowTouched = indexPath.row;

detailViewController = [self.splitViewController.viewControllers lastObject];
NSLog(@"%@", detailViewController);

detailViewController.detailItem = indexRowTouched;
NSLog(@"index row %i", indexRowTouched);

}

Здесь выдается исключение

detailViewController.detailItem = indexRowTouched;

2012-03-28 16: 08: 19.625 splittest2 [14895: f803] - [UINavigationController setDetailItem:]: нераспознанный селектор, отправленный экземпляру 0x6b592e0

Из DetailViewController.m

- (void)setDetailItem:(int)newDetailItem
{
if (_detailItem != newDetailItem) {
    _detailItem = newDetailItem;

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

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

Я также отмечаю, что значение detailItem записывает «0», как только загружается detailView, прежде чем строка indexPath будет вообще выбрана.

Мне интересно, почему это свойство не присваивается из MasterViewController, а TableView не обновляется.

EDIT

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
int indexRowTouched = indexPath.row;

detailViewController = (DetailViewController *)[[self.splitViewController.viewControllers lastObject] topViewController];

detailViewController.detailItem = indexRowTouched;
NSLog(@"index row %i", indexRowTouched);

}

Попытка получить доступ к setDetailItem в UINavigationController, кажется, была исправлена ​​путем изменения didSelectRowAtIndexPath к приведенному выше

1 Ответ

0 голосов
/ 29 марта 2012

В вашей функции - (void)configureView вы выполняете

if (self.detailItem) {
    if (detailItem == 0) {
        NSString *medPath = [[NSBundle mainBundle] pathForResource:@"general" ofType:@"plist"];

        NSMutableDictionary *dict = [[NSMutableDictionary alloc] initWithContentsOfFile:medPath];

        self.items = dict;


        NSMutableArray *array = [[NSMutableArray alloc] init]; 

        [array addObjectsFromArray:[[self.items allKeys]
                                    sortedArrayUsingSelector:@selector(compare:)]];
        self.keys = array;

    }

    //etc
}

Поскольку detailItem является int, а не объектом, если оно равно 0, if (detailItem) вернет false. Таким образом, если вы отправляете от 0 до detailItem, ваш оператор configureView if не будет введен и ничего не произойдет.

Вы должны удалить это внешнее выражение if целиком и просто иметь:

- (void)configureView {
    if (detailItem == 0) {
        NSString *medPath = [[NSBundle mainBundle] pathForResource:@"general" ofType:@"plist"];

        NSMutableDictionary *dict = [[NSMutableDictionary alloc] initWithContentsOfFile:medPath];

        self.items = dict;


        NSMutableArray *array = [[NSMutableArray alloc] init]; 

        [array addObjectsFromArray:[[self.items allKeys]
                                    sortedArrayUsingSelector:@selector(compare:)]];
        self.keys = array;

    }

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