`
jsntghf
  • 浏览: 2528615 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

自定义UIAlertView(UITableView)

    博客分类:
  • iOS
阅读更多

UIAlertTableView.h

 

#import <UIKit/UIKit.h>

@class UIAlertView;

@interface UIAlertTableView : UIAlertView {
	UIAlertView *alertView;
	UITableView *tableView;
	int tableHeight;
	int tableExtHeight;	
	id <UITableViewDataSource> dataSource;
	id <UITableViewDelegate> tableDelegate;
}

@property (nonatomic, assign) id dataSource;
@property (nonatomic, assign) id tableDelegate;

@property (nonatomic, readonly) UITableView *tableView;
@property (nonatomic, assign) int tableHeight;

- (void)prepare;

@end

 

UIAlertTableView.m

 

#import "UIAlertTableView.h"

#define kTablePadding 8.0f

@interface UIAlertView (private)
- (void)layoutAnimated:(BOOL)fp;
@end

@implementation UIAlertTableView

@synthesize dataSource;
@synthesize tableDelegate;
@synthesize tableHeight;
@synthesize tableView;

- (void)layoutAnimated:(BOOL)fp {
	[super layoutAnimated:fp];
	[self setFrame:CGRectMake(self.frame.origin.x, self.frame.origin.y - tableExtHeight / 2, self.frame.size.width, self.frame.size.height + tableExtHeight)];
	UIView *lowestView;
	int i = 0;
	while (![[self.subviews objectAtIndex:i] isKindOfClass:[UIControl class]]) {
		lowestView = [self.subviews objectAtIndex:i];
		i++;
	}	
	CGFloat tableWidth = 262.0f;	
	tableView.frame = CGRectMake(11.0f, lowestView.frame.origin.y + lowestView.frame.size.height + 2 * kTablePadding, tableWidth, tableHeight);	
	for (UIView *v in self.subviews) {
		if ([v isKindOfClass:[UIControl class]]) {
			v.frame = CGRectMake(v.frame.origin.x, v.frame.origin.y + tableExtHeight, v.frame.size.width, v.frame.size.height);
		}
	}	
}

- (void)show{
	[self prepare];
    [super show];
}

- (void)prepare {
	if (tableHeight == 0) {
		tableHeight = 150.0f;
	}	
	tableExtHeight = tableHeight + 2 * kTablePadding;	
    tableView = [[UITableView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 0.0f, 0.0f) style:UITableViewStylePlain];
	tableView.backgroundColor = [UIColor orangeColor];
	tableView.delegate = tableDelegate;
	tableView.dataSource = dataSource;		
	[self insertSubview:tableView atIndex:0];	
	[self setNeedsLayout];
}

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

@end

 

AlertTableViewController.h

 

#import <UIKit/UIKit.h>

@interface AlertTableViewController : UIViewController <UIAlertViewDelegate, UITableViewDelegate, UITableViewDataSource> {
	UITableView *myTableView;
	NSArray *array;
	NSIndexPath	*lastIndexPath;	
}

@property (nonatomic, retain) NSIndexPath *lastIndexPath;

- (IBAction)btnClick:sender;

@end

 

AlertTableViewController.m

 

#import "AlertTableViewController.h"
#import "UIAlertTableView.h"

@implementation AlertTableViewController

@synthesize lastIndexPath;

- (void)viewDidLoad {
	array = [[NSArray alloc] initWithObjects:@"test1", @"test2", @"test3", @"test4", nil];
    [super viewDidLoad];
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return [array count];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {    
    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
    }
	NSUInteger row = [indexPath row];
	NSUInteger oldRow = [lastIndexPath row];
	cell.textLabel.text = [array objectAtIndex:row];
	cell.accessoryType = (row == oldRow && lastIndexPath != nil) ? UITableViewCellAccessoryCheckmark : UITableViewCellAccessoryNone;    
    return cell;
}

- (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath{
	return indexPath;
}

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
    return 40;
}

- (void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
	int newRow = [indexPath row];
	int oldRow = [lastIndexPath row];
	if ((newRow == 0 && oldRow == 0) || (newRow != oldRow)){		
		UITableViewCell *newCell = [tableView cellForRowAtIndexPath:indexPath];
		newCell.accessoryType = UITableViewCellAccessoryCheckmark;
		UITableViewCell *oldCell = [tableView cellForRowAtIndexPath: lastIndexPath]; 
		oldCell.accessoryType = UITableViewCellAccessoryNone;
		lastIndexPath = [indexPath retain];	
	}
	[tableView deselectRowAtIndexPath:indexPath animated:YES];
}

- (IBAction)btnClick:sender
{
	UIAlertTableView *alert = [[UIAlertTableView alloc] initWithTitle:@"Select Option"
															  message:nil
															 delegate:self
													cancelButtonTitle:@"Cancel"
													otherButtonTitles:@"Do", nil];
	alert.tableDelegate = self;
	alert.dataSource = self;
	alert.tableHeight = 120;
	[alert show];
	[alert release];
}

- (void)dealloc {
	[lastIndexPath release];
	[array release];
    [super dealloc];
}

@end

 

示例图:


分享到:
评论

相关推荐

    iPhone的UIAlertView加入UITableView

    虽然在iOS 8之后,`UIAlertController`替代了`UIAlertView`,提供了更现代和灵活的界面,但理解如何将`UITableView`与`UIAlertView`结合,对于理解`UIAlertController`的自定义也是很有帮助的。 总之,`"iPhone的...

    自定义带有UITableView的UIAlertView

    刚开始的做法 是 UIAlertView 的基础上addsubview上UITableView,UITableView的大小固定,但是 出现 横屏的时候 UITableView跟UIAlertView的大小不搭配了 ,后来自定义一个UIAlertView的继承类,重写了 ...

    UIAlertView+UITableVIew

    这需要自定义`UIAlertView`,因为原生的`UIAlertView`不支持嵌入`UITableView`。我们可以创建一个继承自`UIAlertView`的子类,并在其内部添加一个`UITableView`实例。同时,为了实现列表滚动,还需要实现`...

    ios-UIalertView.zip

    1. **自定义UIAlertView子类**:扩展UIAlertView,添加一个UITableView或者UICollectionView来展示列表。这样做的好处是可以在保持UIAlertView弹出样式的同时,自由定制列表内容。 2. **使用UIAlertController**:...

    ios-自定义提示框.zip

    本文将深入探讨如何在iOS项目中创建并实现自定义提示框,以替代系统默认的UIAlertView和UIAlertController,提升用户体验。 首先,我们要明白自定义提示框的核心优势在于它可以提供更灵活的设计和交互选项。系统...

    (0060)-iOS/iPhone/iPAD/iPod源代码-弹出视图(Popup View)-TableView Within Alert

    1. **自定义对话框类**:由于原生的UIAlertView不支持嵌入UITableView,所以需要创建一个自定义的弹出视图类,继承自UIViewController,并且可以模拟UIAlertView的外观和行为。 2. **添加UITableView**:在自定义的...

    下拉 AlertView自定义弹出列表

    然而,原生的UIAlertView并不直接支持添加自定义的列表或TableView。因此,我们需要自定义一个视图来达到这个目的。 要创建一个自定义的下拉AlertView,我们可以利用UIAlertController。UIAlertController提供了更...

    ios-带tableView的AlertView.zip

    在这种情况下,我们可以利用自定义视图来扩展AlertView的功能,使其内嵌一个UITableView,从而创建一个“带tableView的AlertView”。 该“ios-带tableView的AlertView.zip”压缩包包含了一个名为“TableAlertDemo-...

    数据刷新Demo

    在实际应用中,为了遵循苹果的最新设计指南,开发者通常会使用UIAlertController替代UIAlertView,因为它提供了更多的自定义选项和更好的适配性,尤其是在iPad等大屏幕设备上。 总之,“数据刷新Demo”涵盖了...

    oc最基础操作demo

    在这个“oc最基础操作demo”中,很可能会演示如何创建一个`UITableView`,设置数据源和委托,自定义单元格的显示,并实现用户交互。同时,也会展示如何使用`UIAlertController`来展示警告或获取用户输入。这些基本...

    IOS应用源码之弹出列表框效果 .rar

    1. `UIAlertController`: 这是iOS 8及更高版本引入的一个类,可以用来替代之前的`UIAlertView`和`UIActionSheet`。`UIAlertController`允许开发者自定义视图控制器的内容、样式和行为,以创建更复杂的警告视图。通过...

    iOS 11 BUG的发现、定位和解决

    在iOS 11的更新中,开发者们遇到了一系列适配问题,其中包括UIScrollView滑动手势的异常、UITableView滑动删除功能的变化以及UIImagePickerViewController取消按钮点击区域的缩小等。本文主要聚焦于一个特定的问题:...

    iOS开发总结

    对于UI设计,除了前面提到的UITextField和UIAlertView的自定义,还包括如何处理CALayer动画、取地址、获取编码等。 总而言之,iOS开发是一个多方面、多层次的知识体系。不仅需要掌握基础的编程语言和开发工具的使用...

    一步一步学习 iOS 6 编程(第四版)

    其他知识点还包括使用UIScrollView进行滚动视图的开发、使用手势识别器、应用UICollectionView进行复杂内容展示、设计UI和增强功能、管理应用设置数据、使用UIAlertView和UIActionSheet进行用户交互、开发定位服务...

    IOS 开发总结

    - 自定义UI组件:包括如何自定义UINavigationController的返回按钮,如何改变UIAlertView的背景,以及如何创建浮动提示等。 - 高级UI操作:讨论了如何让提示窗口在任何界面都能显示,如何禁止程序运行时自动锁屏,...

    iphone开发秘籍代码(1-6章)

    这部分会讲解如何使用UIAlertView和UIAlertController来显示提示信息,以及处理用户的响应。 5. **C05 - 表格(Tables)**: UITableView是iOS开发中的重要组成部分,用于展示列表数据。这一章将介绍如何创建表格...

    facebook-three20-1.0.11

    3. **TTTableView**和**TTTableViewController**:这些组件扩展了标准的UITableView,提供了更丰富的表格视图功能,比如自定义的单元格模板、自动加载更多内容、下拉刷新等。 4. **TTPhotoViewer**:这是一个优雅的...

Global site tag (gtag.js) - Google Analytics