2010-02-24 2 views
1

У меня есть вид входа в систему и после проверки имени пользователя я хочу перейти в представление таблицы. Я загрузил приложение SimpleDrillDown из кодов примеров ящиков, и я хочу, когда я запустил приложение, чтобы сначала просмотреть страницу входа в систему, а затем TableView.iPhone от View до TableView

Если кто-то есть время, проект можно найти здесь: http://developer.apple.com/iphone/library/samplecode/SimpleDrillDown/index.html

Изменения, которые я сделал являются:

SimpleDrillDownAppDelegate.m

 
import "SimpleDrillDownAppDelegate.h" 
import "RootViewController.h" 
import "LoginViewController.h" 
import "DataController.h" 


@implementation SimpleDrillDownAppDelegate 

@synthesize window; 
@synthesize navigationController; 
@synthesize rootViewController; 
@synthesize loginViewController; 
@synthesize dataController; 


- (void)applicationDidFinishLaunching:(UIApplication *)application { 


    //thomas add this 
    LoginViewController *_loginViewController = [[LoginViewController alloc] initWithNibName:@"LoginView" bundle:[NSBundle mainBundle]]; 
    self.loginViewController = _loginViewController; 
// [_loginViewController release]; 
// 
    //thomas add this 

    // Create the data controller. 
    //DataController *controller = [[DataController alloc] init]; 
// self.dataController = controller; 
// [controller release]; 

    //rootViewController.dataController = dataController; 

    /* 
    The navigation and root view controllers are created in the main nib file. 
    Configure the window with the navigation controller's view and then show it. 
    */ 
    //thomas commented this and copy this into LoginView 
    //[window addSubview:[navigationController view]]; 

    //thomas add this 
    [window addSubview:[loginViewController view]]; 
    //thomas add this 


    [window makeKeyAndVisible]; 
} 


- (void)dealloc { 
    //[navigationController release]; 
    //[rootViewController release]; 
    [loginViewController release]; 
    [window release]; 
    //[dataController release]; 
    [super dealloc]; 
} 

@end 

SimpleDrillDownAppDelegate.h
 
@class DataController; 
@class RootViewController; 
@class LoginViewController; 

@interface SimpleDrillDownAppDelegate : NSObject { 

    UIWindow *window; 

    UINavigationController *navigationController; 
    RootViewController *rootViewController; 
    LoginViewController *loginViewController; 

    DataController *dataController; 
} 

@property (nonatomic, retain) IBOutlet UIWindow *window; 
@property (nonatomic, retain) IBOutlet UINavigationController *navigationController; 
@property (nonatomic, retain) IBOutlet RootViewController *rootViewController; 
@property (nonatomic, retain) IBOutlet LoginViewController *loginViewController; 

@property (nonatomic, retain) DataController *dataController; 

@end 

L oginViewController.h

 
#import 

@class DataController; 
@class RootViewController; 
@class LoginViewController; 

@interface LoginViewController : UIViewController { 
    DataController *dataController; 
    IBOutlet UITextField *usernameField; 
    IBOutlet UITextField *passwordField; 
    IBOutlet UIButton *loginButton; 
    IBOutlet UIActivityIndicatorView *loginIndicator; 
    UINavigationController *navigationController; 
    RootViewController *rootViewController; 


} 

@property (nonatomic, retain) UITextField *usernameField; 
@property (nonatomic, retain) UITextField *passwordField; 
@property (nonatomic, retain) UIButton *loginButton; 
@property (nonatomic, retain) UIActivityIndicatorView *loginIndicator; 
@property (nonatomic, retain) IBOutlet UINavigationController *navigationController; 
@property (nonatomic, retain) DataController *dataController; 
@property (nonatomic, retain) IBOutlet RootViewController *rootViewController; 


- (IBAction) login: (id) sender; 

@end 

LoginViewController.m

 
#import "LoginViewController.h" 
#import "DataController.h" 
#import "RootViewController.h" 




@implementation LoginViewController 

@synthesize usernameField; 
@synthesize passwordField; 
@synthesize loginButton; 
@synthesize loginIndicator; 
@synthesize navigationController; 
@synthesize dataController; 
@synthesize rootViewController; 


/* 
// The designated initializer. Override if you create the controller programmatically and want to perform customization that is not appropriate for viewDidLoad. 
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { 
    if (self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]) { 
     // Custom initialization 
    } 
    return self; 
} 
*/ 

/* 
// Implement loadView to create a view hierarchy programmatically, without using a nib. 
- (void)loadView { 
} 
*/ 

/* 
// Implement viewDidLoad to do additional setup after loading the view, typically from a nib. 
- (void)viewDidLoad { 
    [super viewDidLoad]; 
} 
*/ 

/* 
// Override to allow orientations other than the default portrait orientation. 
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { 
    // Return YES for supported orientations 
    return (interfaceOrientation == UIInterfaceOrientationPortrait); 
} 
*/ 

- (void)didReceiveMemoryWarning { 
    // Releases the view if it doesn't have a superview. 
    [super didReceiveMemoryWarning]; 

    // Release any cached data, images, etc that aren't in use. 
} 

- (void)viewDidUnload { 
    // Release any retained subviews of the main view. 
    // e.g. self.myOutlet = nil; 
} 


- (void)dealloc { 
    [super dealloc]; 
} 

- (IBAction) login: (id) sender 
{ 
    // TODO: spawn a login thread 
    NSString *userName = usernameField.text; 
    NSString *pass = passwordField.text; 

    loginIndicator.hidden = FALSE; 
    [loginIndicator startAnimating]; 

    loginButton.enabled = FALSE; 

    //Hardcode here the credentials 



    if ([userName isEqualToString: @"test"] && [pass isEqualToString: @"test"]){ 
    // Create the data controller. 
    DataController *controller = [[DataController alloc] init]; 
    self.dataController = controller; 
    [controller release]; 

    rootViewController.dataController = dataController; 


    [self pushViewController:self.navigationController animated:YES]; 
    }else{ 
     printf("ERROR"); 
    } 



} 


@end 

Наконец я получаю эту ошибку

Error Log

 
2010-02-24 21:19:55.595 SimpleDrillDown[97651:207] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[LoginViewController pushViewController:animated:]: unrecognized selector sent to instance 0x190d8a0' 
2010-02-24 21:19:55.595 SimpleDrillDown[97651:207] Stack: (
    807902715, 
    2501092617, 
    808284155, 
    807854166, 
    807706786, 
    18813, 
    814709201, 
    815110321, 
    815119058, 
    815114808, 
    814812979, 
    814722763, 
    814748641, 
    839148405, 
    807687520, 
    807683624, 
    839142449, 
    839142646, 
    814752238, 
    9140, 
    8994 
) 

Извините за длинный пост, но я не знаю, где еще искать я прочитал тон сообщения здесь :(

Заранее спасибо всем вам

ответ

0

В своем логине IBAction отправьте loginViewController сообщение pushViewController: animated:. Это сообщение и его встречная часть, popViewControllerAnimated: доступны в классе UINavigationController.

К сожалению, ваш LoginViewController не является UINavigationController.

Вы можете исправить эту конкретную ошибку, изменив его:

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

Это предполагает, что LoginViewController в настоящее время размещается в UINavigationController.

+0

Спасибо за ваше время и ваш ответ Я только что попробовал этот, но ничего не происходит, я вижу только загрузку индикатора, но не перенаправление на следующую страницу. Вы считаете, что страница входа должна быть UINavigationController? –

+0

Я нашел это, возможно, это полезно, но я не знаю, как мне изменить свой код, чтобы использовать его, я пытался, но получаю ошибки http://starterstep.wordpress.com/2009/03/ 05/change-a-uinavigationcontroller% E2% 80% 99s-root-view-controller/ –

0

Giao является правильным. вам нужно указать навигационному контроллеру, чтобы он не отображал вид, а не подкласс viewController. навигационный контроллер должен обрабатывать все ваши контроллеры представлений, которые вы хотите для иерархически структурированной части вашего приложения. ваш навигационный контроллер должен сначала использовать свой метод initWithRootViewController: сначала загрузить ваш контроллер входа в систему и показать его представление. затем, когда вы хотите отобразить следующее представление, вы отправляете navigtionController сообщение pushViewController: анимированное: со следующим viewController, который вы хотите отобразить.

0

Другим подходом было бы создать ваше первое представление в качестве контроллера навигации, содержащего UITableView, а затем в viewWillAppear, вы проверите, был ли пользователь вошел в систему. Если они еще не вошли в систему, представите LoginViewController, который вы создаете как покадрово. Преимущество использования модального корневого представления будет вашим табличным представлением. Если в вашем приложении есть вкладка, и ваш первый вид контроллера навигации является контроллером входа в систему, каждый раз, когда вы нажимаете на элемент панели вкладок, отображается ваше окно входа в систему.

Надеюсь, это поможет.

+0

спасибо за помощь, мой друг, это было для моего проекта мастера капитана: D Не понял, что делать, поэтому я изменил мой разум и сделал что-то с java. Однако, когда у меня есть время, я попробую еще раз: D –

Смежные вопросы