iOS開發UI篇—popoverController簡單介紹
一、簡單介紹
1.什么是UIPopoverController
是iPad開發中常見的一種控制器(在iPhone上不允許使用)
跟其他控制器不一樣的是,它直接繼承自NSObject,並非繼承自UIViewController
它只占用部分屏幕空間來呈現信息,而且顯示在屏幕的最前面
2.使用步驟
要想顯示一個UIPopoverController,需要經過下列步驟
(1)設置內容控制器
由於UIPopoverController直接繼承自NSObject,不具備可視化的能力。因此UIPopoverController上面的內容必須由另外一個繼承自UIViewController的控制器來提供,這個控制器稱為“內容控制器”
(2)設置內容的尺寸
顯示出來占據多少屏幕空間
(3)顯示,即從哪個地方冒出來
二、具體的步驟
代碼示例:
新建一個ipad項目,編寫如下代碼:
新建一個繼承自UITableView的控制器,讓其作為popoverController的內容控制器。
YYMenuViewController.m文件
1 // 2 // YYMenuViewController.m 3 // 01-PopoverController簡單介紹 4 // 5 // Created by apple on 14-8-17. 6 // Copyright (c) 2014年 yangyong. All rights reserved. 7 // 8 9 #import "YYMenuViewController.h" 10 11 @interface YYMenuViewController () 12 @property(nonatomic,strong)NSArray *menus; 13 @end 14 15 @implementation YYMenuViewController 16 17 -(NSArray *)menus 18 { 19 if (_menus==nil) { 20 _menus=@[@"列表1",@"列表2",@"列表3",@"列表4"]; 21 } 22 return _menus; 23 } 24 - (void)viewDidLoad 25 { 26 [super viewDidLoad]; 27 } 28 29 -(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 30 { 31 return 1; 32 } 33 -(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 34 { 35 return self.menus.count; 36 } 37 -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 38 { 39 static NSString *ID=@"ID"; 40 UITableViewCell *cell=[tableView dequeueReusableCellWithIdentifier:ID]; 41 if (cell==nil) { 42 cell=[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:ID]; 43 } 44 45 cell.textLabel.text=self.menus[indexPath.row]; 46 return cell; 47 } 48 49 @end
YYViewController.m文件
1 // 2 // YYViewController.m 3 // 01-PopoverController簡單介紹 4 // 5 // Created by apple on 14-8-17. 6 // Copyright (c) 2014年 yangyong. All rights reserved. 7 // 8 9 #import "YYViewController.h" 10 #import "YYMenuViewController.h" 11 12 @interface YYViewController () 13 @property(nonatomic,strong)UIPopoverController *popover; 14 @end 15 16 @implementation YYViewController 17 18 - (void)viewDidLoad 19 { 20 [super viewDidLoad]; 21 } 22 23 -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 24 { 25 //1.新建一個內容控制器 26 YYMenuViewController *menuVc=[[YYMenuViewController alloc]init]; 27 28 //2.新建一個popoverController,並設置其內容控制器 29 self.popover=[[UIPopoverController alloc]initWithContentViewController:menuVc]; 30 31 //3.設置尺寸 32 self.popover.popoverContentSize=CGSizeMake(300, 200); 33 34 //4.顯示 35 [self.popover presentPopoverFromBarButtonItem:self.navigationItem.leftBarButtonItem permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES]; 36 } 37 @end
實現效果如下圖:
說明:在storyboard中添加了導航控制器,並添加了兩個按鈕。
三、常見報錯
在popover的使用過程中,經常會遇到這個錯誤
-[UIPopoverController dealloc] reached while popover is still visible.
錯誤的大體意思是:popover在仍舊可見的時候被銷毀了(調用了dealloc)
從錯誤可以得出的結論
當popover仍舊可見的時候,不准銷毀popover對象
在銷毀popover對象之前,一定先讓popover消失(不可見)
如:在上述代碼中,如果不適用全局變量popover,那么將會出現上面的錯誤。