自定义UIAlertView(UITableView)

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

 

示例图:


自定义UIAlertView(UITableView)

你可能感兴趣的:(ios,iPhone,uialertview)