iOS开发UI篇—popoverController简单介绍

时间:2023-03-08 16:11:48
iOS开发UI篇—popoverController简单介绍

iOS开发UI篇—popoverController简单介绍

一、简单介绍

1.什么是UIPopoverController

是iPad开发中常见的一种控制器(在iPhone上不允许使用)

跟其他控制器不一样的是,它直接继承自NSObject,并非继承自UIViewController

它只占用部分屏幕空间来呈现信息,而且显示在屏幕的最前面

iOS开发UI篇—popoverController简单介绍

2.使用步骤

要想显示一个UIPopoverController,需要经过下列步骤

(1)设置内容控制器

  由于UIPopoverController直接继承自NSObject,不具备可视化的能力。因此UIPopoverController上面的内容必须由另外一个继承自UIViewController的控制器来提供,这个控制器称为“内容控制器”

(2)设置内容的尺寸

  显示出来占据多少屏幕空间

(3)显示,即从哪个地方冒出来

二、具体的步骤

代码示例:

新建一个ipad项目,编写如下代码: 

新建一个继承自UITableView的控制器,让其作为popoverController的内容控制器。

iOS开发UI篇—popoverController简单介绍

YYMenuViewController.m文件

 //
// YYMenuViewController.m
// 01-PopoverController简单介绍
//
// Created by apple on 14-8-17.
// Copyright (c) 2014年 yangyong. All rights reserved.
// #import "YYMenuViewController.h" @interface YYMenuViewController ()
@property(nonatomic,strong)NSArray *menus;
@end @implementation YYMenuViewController -(NSArray *)menus
{
if (_menus==nil) {
_menus=@[@"列表1",@"列表2",@"列表3",@"列表4"];
}
return _menus;
}
- (void)viewDidLoad
{
[super viewDidLoad];
} -(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
return ;
}
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return self.menus.count;
}
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *ID=@"ID";
UITableViewCell *cell=[tableView dequeueReusableCellWithIdentifier:ID];
if (cell==nil) {
cell=[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:ID];
} cell.textLabel.text=self.menus[indexPath.row];
return cell;
} @end

YYViewController.m文件

 //
// YYViewController.m
// 01-PopoverController简单介绍
//
// Created by apple on 14-8-17.
// Copyright (c) 2014年 yangyong. All rights reserved.
// #import "YYViewController.h"
#import "YYMenuViewController.h" @interface YYViewController ()
@property(nonatomic,strong)UIPopoverController *popover;
@end @implementation YYViewController - (void)viewDidLoad
{
[super viewDidLoad];
} -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
//1.新建一个内容控制器
YYMenuViewController *menuVc=[[YYMenuViewController alloc]init]; //2.新建一个popoverController,并设置其内容控制器
self.popover=[[UIPopoverController alloc]initWithContentViewController:menuVc]; //3.设置尺寸
self.popover.popoverContentSize=CGSizeMake(, ); //4.显示
[self.popover presentPopoverFromBarButtonItem:self.navigationItem.leftBarButtonItem permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
}
@end

实现效果如下图:
  iOS开发UI篇—popoverController简单介绍

说明:在storyboard中添加了导航控制器,并添加了两个按钮。

  iOS开发UI篇—popoverController简单介绍

三、常见报错

在popover的使用过程中,经常会遇到这个错误

  -[UIPopoverController dealloc] reached while popover is still visible.

错误的大体意思是:popover在仍旧可见的时候被销毁了(调用了dealloc)

从错误可以得出的结论

  当popover仍旧可见的时候,不准销毁popover对象

  在销毁popover对象之前,一定先让popover消失(不可见)  

如:在上述代码中,如果不适用全局变量popover,那么将会出现上面的错误。