2013-07-25 5 views
19

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

- (IBAction)button:(id)sender { 

    NSString *firstField = self.field.text; 
    NSString *secondField = self.field2.text; 

    self.resultsArray = [[NSArray alloc] initWithObjects:firstField, secondField, nil]; 

    NSUInteger randomResult = arc4random_uniform(self.resultsArray.count); 
    self.label.text = [self.resultsArray objectAtIndex:randomResult]; 

    ImagesViewController *ivc = [[ImagesViewController alloc] init]; 
    ivc.label = self.label.text; 
    [self.navigationController pushViewController:ivc animated:YES]; 

} 
+0

, что контекст этого? вы выделяете контроллер вида из раскадровки? xib-файл? нет ничего вообще случайно? –

ответ

0

Как правило, переход на другой контроллер зрения по телефону:

initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil 

на пользовательских UIViewController.

Если вы не используете xib-файл, то, что вы делаете, может быть и в порядке. Вы динамически создаете элементы пользовательского интерфейса внутри конструктора вашего ImageViewController?

+0

У меня нет xib. Я создаю элементы пользовательского интерфейса из раскадровки. –

+0

В этом случае вы, вероятно, захотите использовать этот метод для обработки вашего перехода на вид: - (void) performSegueWithIdentifier: (NSString *) отправитель идентификатора: (id) отправитель –

2

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

- (id)initWithNibName:(NSString *)nibName bundle:(NSBundle *)nibBundle 

, если у вас есть XIB назначить его как

ImagesViewController *ivc = [[ImagesViewController alloc] initWithNibName:<your xib> bundle:[NSBundle mainbundle]; 

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

47

Когда вы используете раскадровку и хотите нажать контроллер вида в коде (а не на segue), вам нужно дать контроллеру идентификатор и создать его следующим образом:

ImagesViewController *ivc = [self.storyboard instantiateViewControllerWithIdentifier:@"MyIdentifier"]; 
    ivc.label = self.label.text; 
    [self.navigationController pushViewController:ivc animated:YES]; 
+0

Объект раскадровки можно получить с помощью '[UIStoryboard storyboardWithName: @ «Main» bundle: nil]; 'где« Main »- это имя файла раскадровки без расширения (так же может быть« Main_iPhone »или« Main_iPad »). –

+0

@BrianWhite, true, но если вызывающий контроллер находится в той же раскадровке, что и новый контроллер, короче всего использовать self.storyboard. – rdelmar

+0

Несомненно. Я пытался получить доступ к нему из AppDelegate, у которого не было этого свойства, и поэтому пришлось делать еще несколько поисков. Я решил, что добавлю то, что узнал, чтобы другие могли избежать дополнительной работы, если они пытались сделать то же самое. –

1

Это может произойти, если вы каким-то образом получили неправильное соединение между одним из подзонов в раскадровке и представлением контроллера. Проверьте, что реферирующие розетки верны в каждом из ваших подзонов.

2

Xcode 7.3 и Swift 2,2

В моем случае, я внес изменения в раскадровке и сделал это TabBarController и соответствующим образом изменить класс контроллера от UIViewController к UITabBarController. После некоторой настройки это изменение не было благоприятным, и я сделал все изменения и получил черный экран, потому что я забыл изменить класс контроллера. Я изменил его обратно на UIViewController, и он снова начал работать.

Так что проверьте, не сделали ли вы такую ​​же ошибку. Черный экран появился потому, что у раскадровки был класс (UIView/UITabBar/UITableView Controller), но это не то же самое в коде.

1

Я получил хороший:

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

я не использовал/реализации UINavigationController на всех

class TMDetailBlogViewController: UINavigationController { 
    //code goes here 
} 

После

class TMDetailBlogViewController: UIViewController { 
    //code goes here 
} 
Смежные вопросы