在上一篇中,我們已經完成了UIDialogWindow自訂快顯視窗組件,本篇接下來完成使用者的OAuth授權認證功能,完成後效果如。
一、建立名為LoginViewController的UIViewController subclass類型的類檔案,新進的時候記得勾上With XIB user interface選項.接下來我們要把這個ViewController添加到window進行顯示,繼續往下做。
二、開啟xcode自動建立的MinBlog4SinaAppDelegate.h檔案,添加如下代碼:
#import <UIKit/UIKit.h>
@class LoginViewController;
@interface MinBlog4SinaAppDelegate : NSObject <UIApplicationDelegate> {
IBOutlet UIWindow *window;
IBOutlet LoginViewController *loginViewController;
}
@property (nonatomic, retain) IBOutlet UIWindow *window;
@property (nonatomic,retain)IBOutlet LoginViewController *loginViewController;@end
三、開啟MinBlog4SinaAppDelegate.m檔案,添加如下代碼
#import "MinBlog4SinaAppDelegate.h
"#import "LoginViewController.h"
@implementation MinBlog4SinaAppDelegate
@synthesize window;
@synthesize loginViewController;
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
[application setStatusBarHidden:NO];
[self.window addSubview:loginViewController.view];
[self.window makeKeyAndVisible];
return YES;
}
- (void)dealloc
{
[window release];
[loginViewController release];
[super dealloc];
}
四、接下我們要用到Interface Builder這個工具處理UI方面的工作,雙擊MainWindow.xib檔案,這樣IB會開啟這個檔案,然後從Library面版拖一個View Controller組件到MainWindow.xib中,並且把這個組件的class命名成我們上面建的LoginViewController,如所示:
五、接下來滑鼠點擊選中Min Blog4 Sina App Delegate檔案,然後右邊的面板中選擇Connections,然後能看到一個loginViewController,然後滑鼠點擊跟在它後面的小圓圈點,然後能拉出一條線,然後拖拽這個線到上面四步驟中建立的LoginViewController組件上完成串連工作,完成後如所示:
到此我們完成了把LoginViewController的view添加到window進行顯示進行顯示的工作了,這樣時候可以運行看看,不過運行起來後除了白色的螢幕沒有其它任何的東西。
六、開啟LoginViewController.h檔案,添加如下代碼:
#import <UIKit/UIKit.h>
#import "UIDialogWindow.h
"#import "Sqlite.h"
#import "InfoViewController.h"
#import "BlogClient.h"#import "JSON.h"
@interface LoginViewController : UIViewController
{
UIDialogWindow *dialog;
InfoViewController *infoViewController;
NSMutableArray *userList;
BlogClient *blog;
}
@property (nonatomic,retain)NSMutableArray *userList;
@end
上面infoViewController是一個UIViewController,這個是用來提供快顯視窗的內容部分的view用,在上一篇中說過UIDialogWindow組件的內容view是在使用時才提供的,這個infoViewController就是用來給名為dialog的UIDialogWindow組件提供顯示內容view。這樣我們還需要建立名為InfoViewController的UIViewController subclass類型的類檔案,新進的時候記得勾上With XIB user interface選項。
七、如最上面的(圖6)所示這個InfoViewController快顯視窗內容就包括一個顯示文字描述的TextView;一個點擊執行開始的Button,以及左上方的藍色小表徵圖和“資訊提示”,根據這個情況開啟上一步建立InfoViewController.h檔案聲明TextView和Button和按鈕事件,至於藍色小表徵圖和“資訊提示”直接用IB在xib檔案裡加上即可,至於delegate和SEL onClick,是當使用者點擊開始按鈕後會調用delegate的onClick方法,告訴調用這個dialog的UIDialogWindow組件父ViewController按鈕被點擊了,dialog不處理具體的業務。InfoViewController.h具體代碼如下:
#import <UIKit/UIKit.h>
#import "Global.h"
@interface InfoViewController : UIViewController {
id delegate;
SEL onClick;
IBOutlet UITextView *textView;
IBOutlet UIButton *startBtn;
}
@property (nonatomic,retain)IBOutlet UITextView *textView;
@property (nonatomic,retain)IBOutlet UIButton *startBtn;
-(void)setDelegate:(id)aDelegate onClick:(SEL)aOnClick;-(IBAction)startAuth:(id)sender;
@end
八、InfoViewController.m代碼中我們用到了前面準備篇中定義在Global下的pngWithPath的方法,具體如下:
#import "InfoViewController.h"
@implementation InfoViewController
@synthesize textView;
@synthesize startBtn;
-(void)setDelegate:(id)aDelegate onClick:(SEL)aOnClick{ delegate=aDelegate;
onClick=aOnClick;
}
-(IBAction)startAuth:(id)sender
{
if (delegate)
{
[delegate performSelector:onClick withObject:@"start"] ;
}
}
- (void)viewDidLoad
{
[super viewDidLoad];
textView.font=[UIFont systemFontOfSize:15];
[startBtn setBackgroundImage:[[Global pngWithPath:@"btn_h_bg"] stretchableImageWithLeftCapWidth:12.0 topCapHeight:14.0] forState:UIControlStateNormal];
[startBtn setBackgroundImage:[[Global pngWithPath:@"btn_h_bg"] stretchableImageWithLeftCapWidth:12.0 topCapHeight:14.0] forState:UIControlStateHighlighted];
}
- (void)dealloc
{
[textView release];
[startBtn release];
[super dealloc];
}
@end
九、接下來我們用IB來處理介面雙擊InfoViewController.xib開啟,然後設定View到合適的大小尺寸,並且比較重要的是要把這個View的Background設定成Clear Color也就是透明了,其他的就是把相應的TextView Button Label拖到View進行適當布局,大概效果如下:
完成控制項布局後還需要進行串連操作,完成後如:
10、在步驟6中我們只完成LoginViewController.h檔案,然後去做InfoViewController了,現在我們繼續來完成LoginViewController.m檔案,首先是在viewDidLoad方法中進行sqlite資料庫中帳號檢查,並且執行個體化SDK中的BlogClient對象blog,具體代碼如下,對於這個blog對象提供了oauth認證、微博擷取、微博發布等一系列跟微博相關的方法,有興趣的同學可以讀一下sdk的原始碼,相信會很有協助。
#define kOAuthConsumerKey @"3983859935"
#define kOAuthConsumerSecret @"201fea7b1e1203a76a10f3be570f5abb"
@implementation LoginViewController
...................
//如果資料庫中已經有帳號記