Изменение ViewController при нажатии кнопки

#ios #cocoa-touch #uibutton #viewcontroller

#iOS #cocoa-touch #uibutton #viewcontroller

Вопрос:

Я новичок в программировании для iPhone. что я пытаюсь, так это то, что у меня есть один экран с кнопкой. И я хочу изменить view controller не только view при нажатии этой кнопки (я знаю, как добавить вложенный просмотр), потому что из этого 2-го view controller мне нужно перейти к третьему view, что невозможно, если я добавлю вложенный просмотр в первую очередь. Кто-нибудь, пожалуйста, может мне с этим помочь? Возможно ли это? и если да, то каким образом? Все представления и контроллер представления создаются программно. Я не использую IB.

РЕДАКТИРОВАТЬ: вот соответствующий код, который срабатывает при нажатии кнопки

 -(id)showCurrentLoc:(id)sender { 
 locationController = [currentLocController alloc]; 
 [entry removeFromSuperview]; 
 [newLoc removeFromSuperview]; 
 [currentLoc removeFromSuperview]; 
 [self.view setBackgroundColor:[UIColor clearColor]]; //[self.view addSubview: [locationController view]]; 
 [self.navigationController pushViewController:locationController animated:YES];  [locationController release]; 
 return 0; 
} //Location Controller is the tableViewController
  

Спасибо
Vik

Комментарии:

1. Для этого вы можете использовать навигационный контроллер.

Ответ №1:

Вы можете сделать что-то вроде этого

         YourViewController *objYourViewController = [[YourViewController alloc] initWithNibName:@"YourViewController" bundle:nil];
        [self.navigationController pushViewController:objYourViewController animated:YES];
        [YourViewController release];
  

Комментарии:

1. это то, что я пытаюсь, но дело в том, что я пытаюсь использовать TableViewController в качестве моего второго ViewController, но для этого это не работает. Если я просто добавлю [self.view addSubview:[xyztableview view]]. затем я могу видеть свое табличное представление. Я не знаю, что не так в первом подходе?

2. @Vik как вы определяете TableViewController, т.Е. объявление? Не могли бы вы, пожалуйста, опубликовать код для создания объекта для вашего TableViewController?

3. @Jennie- Спасибо, я могу изменить view controller с помощью navigation controller после объявления его в delegate.

Ответ №2:

Обычно для подобных целей используется навигационный контроллер, чтобы пользователь мог легко вернуться к предыдущему просмотру. Затем ваш view controller будет делать что-то вроде этого:

 [self.navigationController pushViewController:someNewViewController animated:YES];
  

Если вы хотите самостоятельно управлять контроллерами просмотра, вы всегда можете просто изменить rootViewController свойство window. Пожалуйста, прочтите руководство по программированию View Controller для получения полной картины.

Комментарии:

1. @Caleb- это то, что я пытаюсь, но дело в том, что я пытаюсь использовать TableViewController в качестве моего второго ViewController, но для этого это не работает. Если я просто добавлю [self.view addSubview:[xyztableview view]]. затем я могу видеть свое табличное представление. Я не знаю, что не так в первом подходе?

2. @Vik Извините — я не могу понять смысл вашего комментария. Поскольку вы являетесь оператором, я предлагаю вам отредактировать свой вопрос, чтобы более четко объяснить реальную проблему. Однако, прежде чем вы это сделаете, пожалуйста, внимательно ознакомьтесь с документом, на который я ссылался. Это обязательное чтение для разработчиков iOS, и в нем определенно объясняется, как перейти с одного контроллера на другой.

3. -(id)showCurrentLoc: (id) отправитель { locationController = [currentLocController alloc]; [запись removeFromSuperview]; [newLoc removeFromSuperview]; [currentLoc removeFromSuperview]; [self.view setBackgroundColor: [UIColor clearColor]]; //[self.view addSubview: [locationController view]]; [self.view NavigationController pushViewController: анимированный locationController: ДА]; [Выпуск locationController]; возвращает 0; } //Контроллер местоположения — это TableViewController

4. Для начала, вы выделяете, но не инициализируете locationController. Далее, если вы используете навигационный контроллер, вам не нужны все эти addSubview / removeFromSuperview; просто вставьте новый view controller в стек навигации.

5. @Caleb, пожалуйста, не могли бы вы сказать мне, является ли viewcontroller, который я хочу нажать, uitabbarcontroller? Я также смущен переключением с одного VC на другой. 99% людей сказали, что используют uinavigationcontroller, он автоматически обрабатывает переключение между VCS. Я хочу настроить переключение между VCS.

Ответ №3:

UINavigationController — это то, что вам нужно. Он управляет стеком UIViewController s, и если вы хотите добавить новый UIViewController, просто вставьте его в этот навигационный стек. Это автоматизирует для вас поведение кнопки возврата, и вы можете извлекать свой текущий UIViewController из стека, когда закончите с ним.

Комментарии:

1. @Krishnabhadra — это то, что я пытаюсь, но дело в том, что я пытаюсь использовать TableViewController в качестве моего второго ViewController, но для этого это не работает. Если я просто добавлю [self.view addSubview:[xyztableview view]]. затем я могу видеть свое табличное представление. Я не знаю, что не так в первом подходе?

2. Это должно сработать .. Можете ли вы опубликовать соответствующий код, чтобы мы могли перепроверить

3. вот соответствующий код, который срабатывает при нажатии кнопки -(id)showCurrentLoc:(id)отправитель { locationController = [currentLocController alloc]; [запись removeFromSuperview]; [newLoc removeFromSuperview]; [currentLoc removeFromSuperview]; [self.view setBackgroundColor: [UIColor clearColor]]; //[self.view добавляет SUBVIEW: [ locationController view]]; [self.NavigationController pushViewController: анимированный locationController: ДА]; [Выпуск locationController]; возвращает 0; } // Контроллер местоположения — это TableViewController

4. @Vik ..не добавляйте код в комментарий.. Вы можете отредактировать свой исходный вопрос и поместить туда код..

5. @Barry удалил ссылку на руководство. В любом случае, это не понадобилось, поскольку я ответил на первоначальный вопрос, который позже был отредактирован, поскольку пользователь использовал UINavigationController.

Ответ №4:

Вы могли бы работать с UINavigationController. Добавление вашего первого UIViewController подобным образом в метод init:

         [self setViewControllers:[NSArray arrayWithObject:viewController]];
  

И затем, когда нажата кнопка или сделан выбор, вы нажимаете на второй контроллер (в первом ViewController):

 [self.navigationController pushViewController:controller animated:YES]; 
  

Таким образом, вы также получите автоматический (кнопка «Назад»). В основном вы создаете стек UIViewControllers, который вы можете нажимать и извлекать, как с обычным стеком.

Я надеюсь, что это поможет. Посмотрите на следующее: Ссылка на класс UINavigationController

Ответ №5:

 - (void) loadViewAtIndex:(NSInteger)index {

    [self unloadViewAtIndex:activeViewIndex];

    switch (index) {

        case 1:
        {
            if (viewController1 == nil)
            {
                viewController1 = [[ViewController1 alloc] initWithNibName:@"ViewController1" bundle:nil];
            }

            viewController1.view.frame = CGRectMake(0.0, 0.0, viewController1.view.frame.size.width, viewController1.view.frame.size.height);

            [window addSubview:viewController1.view];
        }
            break;

        case 2:
        {
            if (viewController2 == nil)
            {
                viewController2 = [[ViewController2 alloc] initWithNibName:@"ViewController2" bundle:nil];
            }

            viewController2.view.frame = CGRectMake(0.0, 0.0, viewController2.view.frame.size.width, viewController2.view.frame.size.height);

            [window addSubview:viewController2.view];
        }
            break;

        default:
            break;
    }

    activeViewIndex = index;
}

- (void) unloadViewAtIndex:(NSInteger)index {
    switch (index) {

        case 1:
        {
            if (viewController1 != nil)
            {
                [viewController1.view removeFromSuperview];
                [viewController1 release];
                viewController1 = nil;
            }
        }
            break;

        case 2:
        {
            if (viewController2 != nil)
            {
                [viewController2.view removeFromSuperview];
                [viewController2 release];
                viewController2 = nil;
            }
        }
            break;

        default:
            break;
    }
}