Открытие представления с таблицей без NavigationController - PullRequest
0 голосов
/ 09 апреля 2010

Я довольно новичок в разработке с Cocoa Touch / XCode и столкнулся с проблемой.

Я делаю своего рода программу чтения RSS для новостного сайта, и у меня есть 5 видов таблиц, по которым перемещаются 5 вкладок в TabBarController. Если кто-то выбирает новостной элемент, я хочу открыть другое представление, отображающее полный новостной элемент. Моя проблема в том, что это не сработает.

Это мой код:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection(NSInteger)section{
    return [[[self rssParser]rssItems]count];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
    UITableViewCell * cell = [tableView dequeueReusableCellWithIdentifier:@"rssItemCell"];
    if(nil == cell){
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:@"rssItemCell"]autorelease];
    }
    cell.textLabel.text = [[[[self rssParser]rssItems]objectAtIndex:indexPath.row]title];
    cell.detailTextLabel.text = [[[[self rssParser]rssItems]objectAtIndex:indexPath.row]description];
    cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
    return cell;
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    [[self appDelegate] setCurrentlySelectedBlogItem:[[[self rssParser]rssItems]objectAtIndex:indexPath.row]];
    [self.appDelegate loadNewsDetails];
}

И он вызывает этот метод в моем делегате:

-(void)loadNewsDetails{
    [[self rootController]pushViewController:detailController animated:YES];
}

Пожалуйста, скажите мне, что я делаю не так. Кстати, я не хочу использовать NavigationController, просто я использую панель вкладок.

Заранее спасибо,

Ken

Ответы [ 3 ]

0 голосов
/ 09 апреля 2010

Я согласен с Алексом, что вы должны попытаться использовать контроллер навигации, если можете, но если вы не хотите, не беспокойтесь, вы все равно можете получить скользящую анимацию, которая очень похожа. Приведенный ниже код покажет вид, учитывающий ориентацию интерфейса и толчок справа, независимо от положения устройства, то же самое для метода скрытия.

- (void) pushMyView:(UIInterfaceOrientation)interfaceOrientation {
    [self.view addSubview:myNewView.view];

    CATransition *animation = [CATransition animation];
    [animation setDuration:0.3];
    [animation setType:kCATransitionPush];

    // Compute direction by orientation
    if (UIInterfaceOrientationPortrait == interfaceOrientation) {
        [animation setSubtype:kCATransitionFromRight];
    } else if (UIInterfaceOrientationLandscapeLeft == interfaceOrientation) {
        [animation setSubtype:kCATransitionFromBottom];
    } else if (UIInterfaceOrientationLandscapeRight == interfaceOrientation) {
        [animation setSubtype:kCATransitionFromTop];
    } else if (UIInterfaceOrientationPortraitUpsideDown == interfaceOrientation) {
        [animation setSubtype:kCATransitionFromLeft];       
    }

    [animation setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]];

    [[window layer] addAnimation:animation forKey:@"ShowMyNewView"];
}

-(void) hideMyView:(UIInterfaceOrientation)interfaceOrientation {
    [myNewView.view removeFromSuperview];

    CATransition *animation = [CATransition animation];
    [animation setDuration:0.3];
    [animation setType:kCATransitionPush];

    // Compute direction by orientation
    if (UIInterfaceOrientationPortrait == interfaceOrientation) {
        [animation setSubtype:kCATransitionFromLeft];
    } else if (UIInterfaceOrientationLandscapeLeft == interfaceOrientation) {
        [animation setSubtype:kCATransitionFromTop];
    } else if (UIInterfaceOrientationLandscapeRight == interfaceOrientation) {
        [animation setSubtype:kCATransitionFromBottom];
    } else if (UIInterfaceOrientationPortraitUpsideDown == interfaceOrientation) {
        [animation setSubtype:kCATransitionFromRight];      
    }

    [animation setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]]; 

    [[window layer] addAnimation:animation forKey:@"HideMyNewView"];    
}
0 голосов
/ 09 апреля 2010

Использование контроллера панели вкладок не означает, что вы также не можете использовать один или несколько контроллеров навигации. Например, приложение iPod делает это, и именно так пользователи будут ожидать, что ваше приложение будет себя вести.

Вам нужно просто добавить пять UINavigationController объектов в файл MainWindow.xib, по одному на каждой вкладке. Затем просто установите представление таблицы RSS в качестве корневого контроллера представления каждого из контроллеров навигации. (Я предполагаю, что вам нужно изменить поведение в зависимости от того, под какой вкладкой находится представление; просто используйте (MyAppDelegate *)[[UIApplication sharedApplication] delegate].tabBarController.selectedIndex в вашем методе viewDidLoad для настройки таблицы).

Затем, чтобы выдвинуть свой контроллер детального просмотра, вы просто сделаете следующий идиоматический код:

DetailController *detailController = [[DetailController alloc] initWithItem:[self.rssParser.rssItems objectAtIndex:indexPath.row]];
[self.navigationController pushViewController:detailController animated:YES];
[detailController release];

Конечно, вам нужно добавить initWithItem: метод к вашему детальному контроллеру:

-(id)initWithItem:(RSSItem *)item {
    if (self = [super initWithNibName:@"DetailController" bundle:nil]) {
        self.item = item;
    }

    return self;
}

Как правило, вы хотите передать контроль над тем, какой элемент отображается на контроллеры представления, выполняющие отображение, вместо того, чтобы пытаться поддерживать центральный контроль в делегате приложения.

0 голосов
/ 09 апреля 2010

Два очка:

  1. Почему вы не хотите использовать навигационный контроллер?
  2. pushViewController:animated: - это метод UINavigationController. Если вы не используете UINavigationController, вы не можете использовать этот метод и получить скользящую анимацию. На данный момент единственным вашим реальным вариантом будет использование presentModalViewController:animated:, при котором будет отображаться модальное представление, скользящее снизу вверх. Вам нужно будет предоставить способ отклонить его, когда вы закончите.

Если вам все еще нужна скользящая анимация, но вы не хотите UINavigationBar, вы можете использовать UINavigationController, но скрыть панель навигации с помощью метода setNavigationBarHidden:animated:. Трудно сказать, каково правильное решение, не зная, каким вы хотите получить конечный результат.

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