iOS UITabBarController проблема - PullRequest
       1

iOS UITabBarController проблема

0 голосов
/ 24 февраля 2012

Я только начинаю разработку iOS, и я получаю сбой при создании UITabBarController с TableViewController на вкладке 1 (2-я вкладка).

Вот мой код - AppDelegate.m:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{
diseases = [NSMutableArray arrayWithCapacity:5];
        Disease *disease1 = [[Disease alloc] init];
        Disease *disease2 = [[Disease alloc] init];
        Disease *disease3 = [[Disease alloc] init];
        Disease *disease4 = [[Disease alloc] init];
        Disease *disease5 = [[Disease alloc] init];

        disease1.name = @"disease1";
        disease2.name = @"disease2";
        disease3.name = @"disease3";
        disease4.name = @"disease4";
        disease5.name = @"disease5";

        [diseases addObject:disease1];
        [diseases addObject:disease2];
        [diseases addObject:disease3];
        [diseases addObject:disease4];
        [diseases addObject:disease5];


UITabBarController *tabBarController = (UITabBarController *)self.window.rootViewController;

UINavigationController *navigationController = 
[[tabBarController viewControllers] objectAtIndex:0];

FirstViewController *firstViewController = [[FirstViewController alloc] initWithNibName:@"NormalBiopsy" bundle:nil];
firstViewController = [[tabBarController viewControllers] objectAtIndex:0];

DiseaseTableViewController *diseaseTableViewController = [[DiseaseTableViewController alloc] initWithNibName:@"DiseaseTableViewController" bundle:nil];
diseaseTableViewController = [[tabBarController viewControllers] objectAtIndex:1];

SecondViewController *secondViewController = [[SecondViewController alloc] 
                                              initWithNibName:@"TestYourSelf" bundle:nil];
secondViewController = [[tabBarController viewControllers] objectAtIndex:2];

ThirdViewController *thirdViewController = [[ThirdViewController alloc] initWithNibName:@"About" bundle:nil];
thirdViewController = [[tabBarController viewControllers] objectAtIndex:3];

// Override point for customization after application launch.
return YES;
}

Это приводит к UITabBarController с пустой таблицей в TableView DiseaseTableViewController - потому что данные не заполняются.Но если я сделаю

diseaseTableViewController.diseases = diseases;

, приложение будет аварийно завершено с:

    Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-                [UINavigationController setDiseases:]: unrecognized selector sent to instance

Поэтому я попытался добавить заболевание TableViewController к навигационному контроллеру:

diseaseTableViewController = [[navigationController viewControllers] objectAtIndex:1];

Что вызывает

    Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[FirstViewController viewControllers]: unrecognized selector sent to instance 

Я попытался заполнить DiseaseTableViewController в реализации этого класса, а не в AppDelegate, но снова завершился пустой таблицей в пользовательском интерфейсе.

Есть идеи?

Ответы [ 2 ]

0 голосов
/ 24 февраля 2012

Я решил эту проблему, оставив исходный AppDelegate как есть, и заполнив данные DiseaseController.diseases в viewDidLoad (), что-то вроде того, что @Zhang упомянул

0 голосов
/ 24 февраля 2012

Хм, не уверен, правильно ли я понял ваш вопрос, но в основном из моего понимания вы хотите создать приложение с интерфейсом панели вкладок, и каждая вкладка может иметь собственную навигацию?

Возможно, вы хотите что-то подобное для структуры приложения:

AppDelegate
|
|
|___ UITabBarController
     |
     |__ UINavigationController1
     |   |
     |   |__ DiseaseController1
     |
     |
     |
     |__ UINavigationController2
     |   |
     |   |__ DiseaseController2
     |
     |
     |
     |__ UINavigationController3
     |   |
     |   |__ DiseaseController3
     |
     |
     |
     |
     |__ UINavigationController4
     |   |
     |   |__ DiseaseController4
     |
     |
     |
     |
     |__ UINavigationController5
         |
         |__ DiseaseController5

Итак, следуя этой структуре, вы бы:

  1. Создайте и установите свой UITabBarController в качестве корневого контроллера для AppDelegate
  2. Создайте свой UINavigationController, установите их как каждую вкладку вашего UITabBarController
  3. Добавьте соответствующий DiseaseViewController к каждому из ваших UINavigationController

Когда вы имеете дело с таблицами, вам нужно не забыть установить источник данных таблицы и делегировать.

Итак, в каком бы DiseaseViewController вы ни создавали свою таблицу, вам нужно сделать что-то вроде:

myTable.source = self;
myTable.delegate = self;

Где self ссылается на DiseaseViewController, в котором вы создали таблицу, например,

// psuedocode 
@class Disease1
{
   UITableView myTable;
}

@property (nonatomic, retain) UITableView myTable;

@end

// implementation code
@implementation Disease1

-(void)viewDidLoad()
{
    . . .
    myTable.source = self;
    myTable.delegate = self;
    . . .
}

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