2009-10-15 67 views
1

也許這是一個愚蠢的問題,但我在切換子視圖中的視圖時遇到問題。讓我來解釋一下代碼結構:從子視圖切換視圖出現問題

我有這些類文件:

/classes/MySoftwareAppDelegate.h 
/classes/MySoftwareAppDelegate.m 
/classes/ViewController.h 
/classes/ViewController.m 
/classes/LoginController.h 
/classes/LoginController.m 
/classes/CustomersController.h 
/classes/CustomersController.m 

我有這方面的觀點:

/resources/MainWindow.xib 
/resources/Login.xib 
/resources/Customers.xib 

在AppDelegate中,我已經成功地插入副視點「登陸」並在應用程序啓動時顯示。

在登錄視圖中,輸入我的用戶名和密碼,然後單擊「登錄」按鈕。點擊此按鈕時,會觸發IBAction。在這個IBAction中,我想要改變與客戶的當前子視圖。

下面是我用的代碼:

MySoftwareAppDelegate.h

#import <UIKit/UIKit.h> 

@class ViewController; 

@interface MySoftwareAppDelegate : NSObject <UIApplicationDelegate> { 
    UIWindow *window; 
ViewController *viewController; 
} 

@property (nonatomic, retain) IBOutlet UIWindow *window; 
@property (nonatomic, retain) IBOutlet ViewController *viewController; 

@end 

MySoftwareAppDelegate.m

#import "MySoftwareAppDelegate.h" 
#import "ViewController.h" 

@implementation MySoftwareAppDelegate 

@synthesize window; 
@synthesize viewController; 


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

    // Override point for customization after application launch 
[window addSubview:viewController.view]; 
    [window makeKeyAndVisible]; 
} 


- (void)dealloc { 
[viewController release]; 
    [window release]; 
    [super dealloc]; 
} 


@end 

ViewController.h

#import <UIKit/UIKit.h> 

@class LoginController; 

@interface ViewController : UIViewController { 
LoginController *loginController; 
} 

@property (nonatomic, retain) LoginController *loginController; 

@end 

ViewController.m

#import "ViewController.h" 
#import "LoginController.h" 

@implementation ViewController 

@synthesize loginController; 

- (void)viewDidLoad { 
LoginController *tmpViewController = [[LoginController alloc] initWithNibName:@"Login" bundle:nil]; 

self.loginController = tmpViewController; 
[self.view insertSubview:loginController.view atIndex:0]; 

[tmpViewController release]; 

    [super viewDidLoad]; 
} 

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

if (self.loginController.view.superview == nil) { 
    self.loginController = nil; 
} 

// 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 { 
[loginController release]; 
    [super dealloc]; 
} 

@end 

LoginController.h

#import <UIKit/UIKit.h> 

@class CustomersController; 

@interface LoginController : UIViewController { 
UIButton *loginButton; 
UITextField *usernameTextField; 
UITextField *passwordTextField; 
NSMutableString *available_credits; 
NSString *current_xml_element; 
CustomersController *customersController; 
} 

@property (nonatomic, retain) IBOutlet UIButton *loginButton; 
@property (nonatomic, retain) IBOutlet UITextField *usernameTextField; 
@property (nonatomic, retain) IBOutlet UITextField *passwordTextField; 
@property (nonatomic, retain) NSMutableString *available_credits; 
@property (nonatomic, retain) NSString *current_xml_element; 
@property (nonatomic, retain) CustomersController *customersController; 

-(IBAction)textFieldDoneEditing:(id)sender; 
-(IBAction)backgroundTap:(id)sender; 
-(IBAction)loginToAccount:(id)sender; 

@end 

LoginController.m

#import "LoginController.h" 
#import "CustomersController.h" 

@implementation LoginController 

@synthesize loginButton; 
@synthesize usernameTextField; 
@synthesize passwordTextField; 
@synthesize customersController; 

- (void)viewDidLoad { 
UIImage *buttonImageNormal = [UIImage imageNamed:@"whiteButton.png"]; 
UIImage *stretchableButtonImageNormal = [buttonImageNormal stretchableImageWithLeftCapWidth:12 topCapHeight:0]; 
UIImage *buttonImagePressed = [UIImage imageNamed:@"blueButton.png"]; 
UIImage *stretchableButtonImagePressed = [buttonImagePressed stretchableImageWithLeftCapWidth:12 topCapHeight:0]; 

[loginButton setBackgroundImage:stretchableButtonImageNormal forState:UIControlStateNormal]; 
[loginButton setBackgroundImage:stretchableButtonImagePressed forState:UIControlStateHighlighted]; 
} 

- (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 { 
[usernameTextField release]; 
[passwordTextField release]; 
    [super dealloc]; 
} 

-(IBAction)textFieldDoneEditing:(id)sender { 
[sender resignFirstResponder]; 
} 

-(IBAction)backgroundTap:(id)sender { 
[usernameTextField resignFirstResponder]; 
[passwordTextField resignFirstResponder]; 
} 

-(IBAction)loginToAccount:(id)sender { 

// bla bla bla... Login check process is done here 

CustomersController *tmpViewController = [[CustomersController alloc] initWithNibName:@"Customers" bundle:nil]; 
self.customersController = tmpViewController; 

[self.view removeFromSuperview]; 

[tmpViewController release]; 

} 

@end 

正如您在上面看到的,在LoginController.m的loginToAccount方法中,我正在檢查登錄信息,然後爲「customers」子視圖設置新的視圖控制器。

然後,我從超級視圖中刪除當前的「登錄」子視圖,但不知道如何添加新的「客戶」子視圖。

在MainWindow.xib中,我有一個視圖控制器鏈接到ViewController類,它是根控制器。

任何幫助表示讚賞。因爲我是Objective-C和iPhone編程的新手,請盡力解釋考慮一個新手程序員:)

再次感謝。

回答

2

您不會將任何視圖添加到視圖層次結構中,只是刪除登錄視圖控制器。如果你想你的客戶視圖添加到視圖層次,你應該使用:

CustomersController *tmpViewController = [[CustomersController alloc] initWithNibName:@"Customers" bundle:nil]; 
self.customersController = tmpViewController; 
[self presentModalViewController:tmpViewController] 

上述方法將確保該viewWillLoad,didLoad等被稱爲帳戶視圖控制器上。它還將負責爲您刪除視圖層次併爲其添加正確的視圖。

+0

感謝您的快速回答。有效! 我沒有意識到presentModalViewController,它解決了我的問題。 乾杯。 – TamTam 2009-10-15 12:05:26