常用代码整理:
Xcode6,引入viewController代码:
1. 在Appdelegate先引入ViewController头文件
2. ViewController vc =(ViewControlleralloc)init;
Self.window.rootViewController = vc;
然后vc就代表ViewController对象,就可以调用其属性和方法了。
一般用通知来取代上面的写法:
//发送通知
[[[[NSNotificationCenterdefaultCenter]] postNotificationName:通知名object::nil];
//接受通知
//IB创建的对象调用initWithCoder要复写方法;
-(instancetype) initWithCoder(NSCoder*)coder{
self = [super initWithCoder:coder];
if(self){
[[ NSNotificationCenterdefaultCenter]addObserver:self selector:@selector(method)name:@”….”object:nil];
}
return self;
}
UILabel 多行文字自动换行 (自动折行)
UIView *footerView = [[UIView alloc]initWithFrame:CGRectMake(10, 100, 300, 180)];
UILabel *label = [[UILabel alloc]initWithFrame:CGRectMake(10, 100, 300, 150)];
label.text = @"where are you? whereare you? where are you? where are you? where are you? where are you? where areyou? where are you? where are you? where are you?";
//清空背景颜色
label.backgroundColor = [UIColorclearColor];
//设置字体颜色为白色
label.textColor = [UIColorwhiteColor];
//文字居中显示
label.textAlignment =UITextAlignmentCenter;
//自动折行设置
label.lineBreakMode =UILineBreakModeWordWrap;
label.numberOfLines = 0;
在iOS中默认的UILabel中的文字在竖直方向上只能居中对齐,博主参考国外网站,从UILabel继承了一个新类,实现了居上对齐,居中对齐,居下对齐。具体如下:
typedef enum
{
VerticalAlignmentTop = 0, // default
VerticalAlignmentMiddle,
VerticalAlignmentBottom,
} VerticalAlignment;
@interface myUILabel : UILabel
{
@private
VerticalAlignment _verticalAlignment;
}
@property (nonatomic) VerticalAlignment verticalAlignment;
@end @implementation myUILabel
@synthesize verticalAlignment = verticalAlignment_;
- (id)initWithFrame:(CGRect)frame {
if (self = [super initWithFrame:frame]) {
self.verticalAlignment = VerticalAlignmentMiddle;
}
return self;
}
- (void)setVerticalAlignment:(VerticalAlignment)verticalAlignment {
verticalAlignment_ = verticalAlignment;
[self setNeedsDisplay];
}
- (CGRect)textRectForBounds:(CGRect)bounds limitedToNumberOfLines:(NSInteger)numberOfLines {
1. CGRect textRect = [super textRectForBounds:bounds limitedToNumberOfLines:numberOfLines];
2. switch (self.verticalAlignment) {
case VerticalAlignmentTop:
textRect.origin.y = bounds.origin.y;
break;
case VerticalAlignmentBottom:
textRect.origin.y = bounds.origin.y + bounds.size.height - textRect.size.height;
break;
case VerticalAlignmentMiddle:
// Fall through.
default:
textRect.origin.y = bounds.origin.y + (bounds.size.height - textRect.size.height) / 2.0;
}
return textRect;
}
-(void)drawTextInRect:(CGRect)requestedRect {
CGRect actualRect = [self textRectForBounds:requestedRect limitedToNumberOfLines:self.numberOfLines];
[super drawTextInRect:actualRect];
}
@end
lbl_mylabel = [[myUILabel alloc] initWithFrame:CGRectMake(20, 50, 150, 600)];
UIColor *color = [UIColor colorWithPatternImage:[UIImage imageNamed:@"halfTransparent.png"]];//使用半透明图片作为label的背景色
lbl_mylabel.backgroundColor = color;
lbl_mylabel.textAlignment = UITextAlignmentLeft;
lbl_mylabel.textColor = UIColor.whiteColor;
lbl_mylabel.lineBreakMode = UILineBreakModeWordWrap;
lbl_mylabel.numberOfLines = 0;
[lbl_mylabel setVerticalAlignment:VerticalAlignmentTop];
[self addSubview:lbl_mylabel];
ios UILabel 变量名不能为title
-[UILabel copyWithZone:]: unrecognized selector sent to instance
遇到了这样一个错误,找了半天没找到是什么错误,于是,Google搜索,打开第一个链接http://stackoverflow.com/questions/10784207/uilabel-copywithzone-unrecognized-selector-sent-to-instance
UILabel设置过长文本中间为省略号
label.lineBreakMode = NSLineBreakByTruncatingMiddle;
http://blog.youkuaiyun.com/zhaopenghhhhhh/article/details/16331041
·UILable是iPhone界面最基本的控件,主要用来显示文本信息。
·常用属性和方法有:
1、创建
CGRect rect =CGRectMake(100, 200,50, 50);
UILabel *label= [[UILabel alloc] initWithFrame:rect];
2、text //设置和读取文本内容,默认为nil
label.text = @”文本信息”; //设置内容
NSLog(@”%@”,label.text); //读取内容
3、textColor //设置文字颜色,默认为黑色
lable.textColor= [UIColor redColor];
4、font //设置字体大小,默认17
label.font =[UIFont systemFontOfSize:20]; //⼀一般方法
label.font =[UIFont boldSystemFontOfSize:20]; //加粗方法
label.font = [UIFontfontWithName:@"Arial" size:16]; //指定
字体的方法
//还有⼀一种从外部导入字体的方法。
5、textAlignment //设置标签文本对齐方式。
label.textAlignment= NSTextAlignmentCenter; //还有
NSTextAlignmentLeft、 NSTextAlignmentRight.
6、numberOfLines //标签最多显示行数,如果为0则表示多行。
label.numberOfLines= 2;
7、enabled //只是决定了Label的绘制方式,将它设置
为NO将会使文本变暗,表示它没有激活,这时向它设置颜色值是无效的。
label.enable =NO;
8、highlighted //是否高亮显示
label.highlighted= YES;
label.highlightedTextColor= [UIColor orangeColor]; //高亮
显示时的文本颜色
9、ShadowColor //设置阴影颜色
[labelsetShadowColor:[UIColor blackColor]];
10、ShadowOffset //设置阴影偏移量
[labelsetShadowOffset:CGSizeMake(-1, -1)];
11、baselineAdjustment //如果adjustsFontSizeToFitWidth属性设
置为YES,这个属性就来控制文本基线的行为。
label.baselineAdjustment= UIBaselineAdjustmentNone;
UIBaselineAdjustmentAlignBaselines= 0,默认,文本最上端与中线对齐。
UIBaselineAdjustmentAlignCenters, 文本中线与label中线对齐。
UIBaselineAdjustmentNone,文本最低端与label中线对齐。
12、Autoshrink //是否自动收缩
Fixed Font Size默认,如果Label宽度小于文字长度时时,文字大小不自动缩放
minimumScaleFactor设置最小收缩比例,如果Label宽度小于文字长度时,文字
进行收缩,收缩超过比例后,停止收缩。
minimumFontSize设置最小收缩字号,如果Label宽度小于文字长度时,文字字号
减小,低于设定字号后,不再减小。//6.0以后不再使用了。
label.minimumScaleFactor= 0.5;
13、adjustsLetterSpacingToFitWidth //改变字母之间的间距来适应Label大小
myLabel.adjustsLetterSpacingToFitWidth= NO;
14、 lineBreakMode //设置文字过长时的显示格式
label.lineBreakMode= NSLineBreakByCharWrapping;以字符为显示单位显
示,后面部分省略不显示。
label.lineBreakMode= NSLineBreakByClipping;剪切与文本宽度相同的内
容长度,后半部分被删除。
label.lineBreakMode= NSLineBreakByTruncatingHead;前面部分文字
以……方式省略,显示尾部文字内容。
label.lineBreakMode= NSLineBreakByTruncatingMiddle;中间的内容
以……方式省略,显示头尾的文字内容。
label.lineBreakMode= NSLineBreakByTruncatingTail;结尾部分的内容
以……方式省略,显示头的文字内容。
label.lineBreakMode= NSLineBreakByWordWrapping;以单词为显示单位显
示,后面部分省略不显示。
15、 adjustsFontSizeToFitWidth //设置字体大小适应label宽度
label.adjustsFontSizeToFitWidth= YES;
16、attributedText:设置标签属性文本。
NSString *text= @"first";
NSMutableAttributedString*textLabelStr =
[[NSMutableAttributedStringalloc]
initWithString:text];
[textLabelStr
setAttributes:@{NSForegroundColorAttributeName:
[UIColorlightGrayColor], NSFontAttributeName :
[UIFontsystemFontOfSize:17]} range:NSMakeRange(11,
10)];
label.attributedText= textLabelStr;
17、竖排文字显示每个文字加一个换行符,这是最方便和简单的实现方式。
label.text = @"请\n竖\n直\n方\n向\n排\n列";
label.numberOfLines= [label.text length];
18、计算UIlabel 随字体多行后的高度
CGRect bounds =CGRectMake(0, 0,200, 300);
heightLabel =[myLabel textRectForBounds:bounds
limitedToNumberOfLines:20]; //计算20行后的Label的Frame
NSLog(@"%f",heightLabel.size.height);
19、UILabel根据字数多少自动实现适应高度
UILabel*msgLabel = [[UILabel alloc]
initWithFrame:CGRectMake(15, 45, 0, 0)];
msgLabel.backgroundColor= [UIColor lightTextColor];
[msgLabelsetNumberOfLines:0];
msgLabel.lineBreakMode= UILineBreakModeWordWrap;
msgLabel.font =[UIFont fontWithName:@"Arial"size:12];
CGSize size =CGSizeMake(290, 1000);
msgLabel.text =@"获取到的deviceToken,我们可以通过webservice服务提
交给.net应用程序,这里我简单处理,直接打印出来,拷贝到.net应用环境中使
用。";
CGSize msgSie =[msgLabel.text sizeWithFont:fonts
constrainedToSize:size];
[msgLabelsetFrame:CGRectMake(15, 45, 290, msgSie.height)];
20、渐变字体Label
UIColor*titleColor = [UIColor colorWithPatternImage:[UIImage
imageNamed:@"btn.png"]];
NSString *title= @"Setting";
UILabel*titleLabel = [[UILabel alloc]
initWithFrame:CGRectMake(0, 0, 80, 44)];
titleLabel.textColor= titleColor;
titleLabel.text= title;
titleLabel.font= [UIFont boldSystemFontOfSize:20];
titleLabel.backgroundColor= [UIColor clearColor];
[self.viewaddSubview:titleLabel];
[titleLabelrelease];
21、Label添加边框
titleLabel.layer.borderColor= [[UIColor grayColor] CGColor];
titleLabel.layer.borderWidth= 2;
UIButton *btn= [UIButton buttonWithType:UIButtonTypeRoundedRect];//初始化button,选择button类型
btn.frame = CGRectMake(30, 360, 90, 35);//大小和位置
[btn setTitle:@"ZoomIn" forState:UIControlStateNormal];//正常状况下button显示的标题
[btn setTitle:@"ZoomIn" forState:UIControlStateHighlighted];//高亮显示时button的标题
[btn addTarget:self action:@selector(zoomInAction:) forControlEvents:UIControlEventTouchUpInside];//button被按下又抬起后发生的事件
//@selector可以理解为"选择子",selector是一个指针变量,类似于sender。这里是将method的方法指定给新建的这个btn。
/*在 method 方法里可以将 sender 看作是 btn 了 比如设置btn的hidden属性等等 btn.hidden = YES; 这样btn被隐藏了
/*
// 通过背景图片设置按钮高亮
IImage *normalImage = [UIImage imageNamed:@"NormalBlueButton.png"];
UIImage *highlightedImage = [UIImageimageNamed:@"HighlightedBlueButton"];
self.myButton = [UIButtonbuttonWithType:UIButtonTypeCustom];
self.myButton.frame = CGRectMake(110.0f,200.0f,100.0f, 37.0f);
[self.myButton setBackgroundImage:normalImageforState:UIControlStateNormal];
[self.myButton setBackgroundImage:highlightedImage forState:UIControlStateHighlighted];
[self.myButton setTitle:@"Normal" forState:UIControlStateNormal];
[self.myButton setTitle:@"Pressed" forState:UIControlStateHighlighted];
1.手写UIButton
CGRect btnControlRect=CGRectMake(200, theHeight, 100, 30);
UIButton *btnControl=[[UIButtonalloc] initWithFrame:btnControlRect];
//设置按钮的背景图片
[btnControlsetBackgroundImage:[UIImage imageNamed:@"desc_nomal.png"] forState:UIControlStateNormal];
[btnControlsetBackgroundImage:[UIImage imageNamed:@"desc_nomal.png"] forState:UIControlStateHighlighted];
[btnControlsetBackgroundImage:[UIImage imageNamed:@"desc_nomal.png"] forState:UIControlStateSelected];
[btnControlsetBackgroundColor:[UIColor clearColor]];
[btnControladdTarget:self action:@selector(ClickControlAction:) forControlEvents:UIControlEventTouchUpInside];
[self.scrollViewaddSubview:btnControl];
[btnControl release];
// 设置按钮的文本
[_btnOrder setTitle:@"预定" forState:UIControlStateNormal];
[_btnOrder setTitle:@"取消" forState:UIControlStateSelected];
// 设置按钮的文本颜色
[_btnOrder setTitleColor:[UIColor colorWithRed:50/255.0 green:50/255.0 blue:50/255.0alpha:1.0] forState:UIControlStateNormal];
[_btnOrder setTitleColor:[UIColor colorWithRed:255/255.0 green:255/255.0blue:255/255.0 alpha:1.0] forState:UIControlStateSelected];
// 设置按钮的文本大小
[_btnOrder.titleLabelsetFont:[UIFont systemFontOfSize:14]];
1.UITextField的初始化和设置
textField = [[UITextField alloc] initWithFrame:CGRectMake(120.0f, 80.0f,150.0f, 30.0f)];
[textField setBorderStyle:UITextBorderStyleRoundedRect]; //外框类型
textField.placeholder = @"password"; //默认显示的字
textField.secureTextEntry = YES; //密码
textField.autocorrectionType = UITextAutocorrectionTypeNo;
textField.autocapitalizationType = UITextAutocapitalizationTypeNone;
textField.returnKeyType = UIReturnKeyDone;
textField.clearButtonMode = UITextFieldViewModeWhileEditing; //编辑时会出现个修改X
textField.delegate = self;
2.要实现的Delegate方法,关闭键盘
-(BOOL)textFieldShouldReturn:(UITextField *)textField
{
[self.textField resignFirstResponder];
return YES;
}
3. 可以在UITextField使用下面方法,按return键返回
-(IBAction) textFieldDone:(id) sender
{
[textFieldName resignFirstResponder];
}
链接TextField控件的"Did end on exit"
最右侧加图片是以下代码,
UIImageView *imgv=[[UIImageView alloc] initWithImage:[UIImageimageNamed:@"right.png"]];
text.rightView=imgv;
text.rightViewMode = UITextFieldViewModeAlways;
如果是在最左侧加图片就换成:
text.leftView=imgv;
text.leftViewMode =UITextFieldViewModeAlways;
UITextField 继承自 UIControl,此类中有一个属性contentVerticalAlignment
所以想让UITextField里面的text垂直居中可以这样写:
text.contentVerticalAlignment =UIControlContentVerticalAlignmentCenter;
查看函数的方法:
按住command键双击进入函数声明
按住alt键双击进入doc文档
///
文本框常用方法:
如何用程序删除文本框中选中的文本
[textView delete: nil];
///
如何限制文本框只能输入数字:
建立NSNumberFormatter的子类,增加这个方法,将formatter链接至文本框。
- (BOOL) isPartialStringValid: (NSString**) partialStringPtr
proposedSelectedRange: (NSRangePointer) proposedSelRangePtr
originalString: (NSString *)origString
originalSelectedRange: (NSRange) origSelRange
errorDescription: (NSString **) error
{
NSCharacterSet *nonDigits;
NSRange newStuff;
NSString *newStuffString;
nonDigits = [[NSCharacterSet decimalDigitCharacterSet] invertedSet];
newStuff = NSMakeRange(origSelRange.location,
proposedSelRangePtr->location
-origSelRange.location);
newStuffString = [*partialStringPtr substringWithRange: newStuff];
if ([newStuffString rangeOfCharacterFromSet: nonDigits
options:NSLiteralSearch].location != NSNotFound) {
*error = @"不是数字";
return (NO);
}else {
*error = nil;
return (YES);
}
}
///
从文本框获取十六进制数据的代码
char singleNumberString[3] ={'\0','\0','\0'};
uint32_t singleNumber = 0;
uint32_t i = 0;
NSMutableData *data = [NSMutableData data];
//从文本框获取到得数据
const char *buf = [[_hexToSendTextField text]UTF8String];
//转换为十六进制
for(i = 0; i < strlen(buf); i+=2)
{
if(((i+1) < len && isxdigit(buf)&& (isxdigit(buf[i+1])))
{
singleNumberString[0] = buf;
singleNumberString[1] = buf[i+1];
sscanf(singleNumberString, "%x",&singleNumber);
[data appendBytes:(void*)(&tmp) length:1];
}
else
{
break;
}
}
//输出
NSLog(@"%@", data);
/
点击 UITextView 输入文字,光标都从最初点开始
-(void)textViewDidChangeSelection:(UITextView *)textView
{
NSRange range;
range.location = 0;
range.length = 0;
textView.selectedRange = range;
}
///
软键盘
在登录页面要实现用户名和密码,密码要是点点格式,引入当前页面光标要停留在用户名选项,软键盘要弹出界面。如下图:
弹出键盘:
[username becomeFirstResponder];
取消键盘:
[username resignFirstResponder];
密码保护:
password.secureTextEntry=YES;
//
1.UITextField的初始化和设置
textField = [[UITextField alloc] initWithFrame:CGRectMake(120.0f, 80.0f,150.0f, 30.0f)];
[textField setBorderStyle:UITextBorderStyleRoundedRect]; //外框类型
textField.placeholder = @"password"; //默认显示的字
textField.secureTextEntry = YES; //密码
textField.autocorrectionType = UITextAutocorrectionTypeNo;
textField.autocapitalizationType = UITextAutocapitalizationTypeNone;
textField.returnKeyType = UIReturnKeyDone;
textField.clearButtonMode = UITextFieldViewModeWhileEditing; //编辑时会出现个修改X
textField.delegate = self;
2.要实现的Delegate方法,关闭键盘
-(BOOL)textFieldShouldReturn:(UITextField *)textField
{
[self.textField resignFirstResponder];
return YES;
}
3. 可以在UITextField使用下面方法,按return键返回
-(IBAction) textFieldDone:(id) sender
{
[textFieldName resignFirstResponder];
}
链接TextField控件的"Did end on exit"
限制输入文本的长度
- (BOOL)textField:(UITextField *)textFieldshouldChangeCharactersInRange:(NSRange)range replacementString:(NSString*)string
{
if (range.location >= MAX_LENGTH)
return NO; // return NO to not change text
return YES;
}
if (textField.text.length >= 10&& range.length == 0)
return NO;
return YES;
- (BOOL)textField:(UITextField *)textFieldshouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
if([textField.text length] > MAXLENGTH)
{
textField.text = [textField.text substringToIndex:MAXLENGTH-1];
return NO;
}
return YES;
}
//
使用UITextFieldDelegate来隐藏键盘
在iPhone界面上,时常会需要当用户输入完内容后,隐藏键盘。当然有很多方法,今天只介绍使用UITextFieldDelegate这个协议实现隐藏键盘。
其实很简单,需要三步:
1. 在你的控制器类中,加入UITextFieldDelegate这个协议
如:@interface AddItemViewController : UIViewController<UITextFieldDelegate>
2. 在使用了UITextFieldDelegate协议的控制器类的实现中,加入- (BOOL)textFieldShouldReturn:方法。
- (BOOL)textFieldShouldReturn:(UITextField*)textField {
[textField resignFirstResponder];
return YES;
}
//设置焦点:
[UITextField becomeFirstResponder];
3. 将xib文件中的TextField控件的delegate变量指向到之前使用UITextFieldDelegate协议的那个控制器类,将 TextField的delegateIBOutlet变量右键链接到前面的控制器类的实例上。或者使用代码方式,指定相关TextField的delegate变量。
- (void)viewDidLoad
{
[super viewDidLoad];
itemNameField.delegate = self;
priceField.delegate = self;
}
一、创建
滑块是一个标准的UIControl。我们可以通过代码创建,如同开关(UISwitch)的宽与高都会被忽略一样滑块的高也会被忽略(但是宽度不会):
3. UISlider* mySlider = [ [ UISlider alloc ] initWithFrame:CGRectMake(20.0,10.0,200.0,0.0) ];//高度设为0就好
二、设定范围与默认值
创建完毕的同时我们要设置好滑块的范围,如果你没有设置,那么会使用默认的0.0 到1.0 之间的值。UISlider提供了两个属性来设置范围:mininumValue 和 maxinumValue:
1. mySlider.mininumValue = 0.0;//下限
2. mySlider.maxinumValue = 50.0;//上限
同时你也可以为滑块设定一个默认值:
1. mySlider.value = 22.0;
三、两端添加图片
滑块可以在任何一段显示图像。添加图像后会导致滑动条缩短,所以记得要记得在创建的时候增加滑块的宽度来适应图像。
1. [ mySlider setMininumTrackImage: [ UIImage applicationImageNamed:@"min.png" ] forState: UIControlStateNormal ];
2. [ mySlider setMaxinumTrackImage: [ UIImage applicationImageNamed:@"max.png" ] forState: UIControlStateNormal ];
你可以根据滑块的各种不同状态显示不同的图像。下面是可用状态:
UIControlStateNormal
UIControlStateHighlighted
UIControlStateDisabled
UIControlStateDisabled
UIControlStateSelected
四、显示控件
1. [ parentView addSubview:myslider ];//添加到父视图
2. 或
3. [ self.navigationItem.titleView addSubview:myslider ];//添加到导航栏
五、读取控件值
1. float value = mySlider.value;
六、通知
要想在滑块值改变时收到通知,可以用UIControl类的addTarget方法为UIControlEventValueChanged事件添加一个动作。
1. [ mySlider addTarget:self action:@selector(sliderValueChanged:) forControlEventValueChanged ];
只要滑块停放(注意是停放,如果要在拖动中也触发,请看后文)到新的位置,你的动作方法就会被调用:
1. - (void) sliderValueChanged:(id)sender{
2. UISlider* control = (UISlider*)sender;
3. if(control == mySlider){
4. float value = control.value;
5. /* 添加自己的处理代码 */
6. }
7. }
如果要在拖动中也触发,需要设置滑块的 continuos 属性:
1. mySlider.continuous = YES ;
这 个通知最简单的一个实例就是实时显示滑块的值,很奇怪的苹果显示滑块的值是一个私有的API(setShowValue),私有就私有,大不了我不用就 是。我们可以用一个UILabel来显示值,在每次触发上面的方法时改变label的值,不就可以实时显示了吗?当然我们可以做的不仅仅是这个,还有更多 的 cool 事情可以去实现,就看你的手段与想象力了。
///
如果您希望在App里引入音量调节功能,生成一个滑动条,用户拖动该控件就能调节iPhone音量--可以用uislider + nstimer。 代码 [[NSNotificationCenterdefaultCenter] addObserver:self selector:@selector(volumeChanged:) name:@"AVSystemController_SystemVolumeDidChangeNotification" object:nil];
#import"SegmentedControlTestViewController.h"
@implementation SegmentedControlTestViewController
@synthesize segmentedControl;
/****************************************
Tasks
Initializing a Segmented Control
– initWithItems:
Managing Segment Content
– setImage:forSegmentAtIndex:
– imageForSegmentAtIndex:
– setTitle:forSegmentAtIndex:
– titleForSegmentAtIndex:
Managing Segments
– insertSegmentWithImage:atIndex:animated:
– insertSegmentWithTitle:atIndex:animated:
numberOfSegments property
– removeAllSegments
– removeSegmentAtIndex:animated:
selectedSegmentIndex property
Managing Segment Behavior and Appearance
momentary property
segmentedControlStyle property
tintColor property
– setEnabled:forSegmentAtIndex:
– isEnabledForSegmentAtIndex:
– setContentOffset:forSegmentAtIndex:
– contentOffsetForSegmentAtIndex:
– setWidth:forSegmentAtIndex:
– widthForSegmentAtIndex:
*********************************************/
// Implement viewDidLoad to do additional setup after loading the view,typically from a nib.
-(void)viewDidLoad {
NSArray *segmentedArray = [[NSArray alloc]initWithObjects:@"1",@"2",@"3",@"4",nil];
//初始化UISegmentedControl
UISegmentedControl *segmentedTemp = [[UISegmentedControlalloc]initWithItems:segmentedArray];
segmentedControl = segmentedTemp;
segmentedControl.frame = CGRectMake(60.0, 10.0, 200.0, 50.0);
[segmentedControl setTitle:@"two" forSegmentAtIndex:1];//设置指定索引的题目
[segmentedControl setImage:[UIImage imageNamed:@"lan.png"]forSegmentAtIndex:3];//设置指定索引的图片
[segmentedControl insertSegmentWithImage:[UIImageimageNamed:@"mei.png"] atIndex:2 animated:NO];//在指定索引插入一个选项并设置图片
[segmentedControl insertSegmentWithTitle:@"insert" atIndex:3animated:NO];//在指定索引插入一个选项并设置题目
[segmentedControl removeSegmentAtIndex:0 animated:NO];//移除指定索引的选项
[segmentedControl setWidth:70.0 forSegmentAtIndex:2];//设置指定索引选项的宽度
[segmentedControl setContentOffset:CGSizeMake(10.0,10.0)forSegmentAtIndex:1];//设置选项中图片等的左上角的位置
//获取指定索引选项的图片imageForSegmentAtIndex:
UIImageView *imageForSegmentAtIndex =[[UIImageView alloc]initWithImage:[segmentedControlimageForSegmentAtIndex:1]];
imageForSegmentAtIndex.frame = CGRectMake(60.0, 100.0, 30.0, 30.0);
//获取指定索引选项的标题titleForSegmentAtIndex
UILabel *titleForSegmentAtIndex = [[UILabelalloc]initWithFrame:CGRectMake(100.0, 100.0, 30.0, 30.0)];
titleForSegmentAtIndex.text = [segmentedControltitleForSegmentAtIndex:0];
//获取总选项数segmentedControl.numberOfSegments
UILabel *numberOfSegments = [[UILabelalloc]initWithFrame:CGRectMake(140.0, 100.0, 30.0, 30.0)];
numberOfSegments.text = [NSStringstringWithFormat:@"%d",segmentedControl.numberOfSegments];
//获取指定索引选项的宽度widthForSegmentAtIndex:
UILabel *widthForSegmentAtIndex = [[UILabelalloc]initWithFrame:CGRectMake(180.0, 100.0, 70.0, 30.0)];
widthForSegmentAtIndex.text = [NSStringstringWithFormat:@"%f",[segmentedControlwidthForSegmentAtIndex:2]];
segmentedControl.selectedSegmentIndex = 2;//设置默认选择项索引
segmentedControl.tintColor = [UIColor redColor];
segmentedControl.segmentedControlStyle = UISegmentedControlStylePlain;//设置样式
segmentedControl.momentary = YES;//设置在点击后是否恢复原样
[segmentedControl setEnabled:NO forSegmentAtIndex:4];//设置指定索引选项不可选
BOOL enableFlag = [segmentedControl isEnabledForSegmentAtIndex:4];//判断指定索引选项是否可选
NSLog(@"%d",enableFlag);
[self.view addSubview:widthForSegmentAtIndex];
[self.view addSubview:numberOfSegments];
[self.view addSubview:titleForSegmentAtIndex];
[self.view addSubview:imageForSegmentAtIndex];
[self.view addSubview:segmentedControl];
[widthForSegmentAtIndex release];
[numberOfSegments release];
[titleForSegmentAtIndex release];
[segmentedTemp release];
[imageForSegmentAtIndex release];
//移除所有选项
//[segmentedControlremoveAllSegments];
[super viewDidLoad];
}
/*
// Override to allow orientations other than the default portraitorientation.
-(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation{
// Return YES for supported orientations
return (interfaceOrientation == UIInterfaceOrientationPortrait);
}
*/
-(void)didReceiveMemoryWarning {
// Releases the view if it doesn't have a superview.
[super didReceiveMemoryWarning];
// Release any cached data, images, etc that aren't in use.
}
-(void)viewDidUnload {
// Release any retained subviews of the main view.
// e.g. self.myOutlet = nil;
}
-(void)dealloc {
[segmentedControl release];
[super dealloc];
}
@end
两个View之间的传值可以有多种方式。但本人觉得最合理最自然并且最安全的方式是通过Delegate方式。
设想一个场景:
1. 有两个View,分别是A和B。
2. 点击A中的某个按钮,出来B。
3. 对B做某些操作(比如输入文字到textField,选择picker等等)。
4. 然后点击B中的确定按钮,将在B中进行的操作所产生的数据传递给A。
这种应用场景在编写iPhone App应用的时候是十分常见的,比如利用modelview来进行某些条件的选择,进行注册操作等等。下面具体说说利用Delegate是如何将View B中的数据传递回View A。
第一步:
在B类的类定义之前加入一下代码,定义一个delegate:
[plain] view plaincopy
@protocol ViewBControllerDelegate <NSObject>
-(void) viewAWillDoThisAction:(UIViewController *) currentView;
@end
这个delegate定义了一个方法,所有实现了这个delegate的类都必须实现这个方法。
然后再在B类的类定义中添加一个member,加入以下代码:
[plain] view plaincopy
NSObject<FilterSpotsViewControllerDelegate> *view_A;
从名字来看,就知道待会这个值会被赋予View A。
第二步:
让A类实现ViewBControllerDelegate:
[plain] view plaincopy
@interface ViewAController : UIViewController<ViewBControllerDelegate>
并且让A类实现方法viewAWillDoThisAction:
[plain] view plaincopy
-(void) viewAWillDoThisAction:(UIViewController *) view_B {
//利用view_B来传值。如self.a = view_B.a;
}
上面代码中,将会在B类中将B类自己(self)的指针传递给view_B(见下面第四步)。这样就可以把B类的数据传递给A类了。
第三步:
就如我之前所说的,View A点某个按钮之后,出现View B。假设这个按钮对应的方法是“-(void) pushViewB: (id) sender"。那么应在这个方法中将A类自身的指针(self)传递给之前第一步在B类中定义的成员变量View_A:
[plain] view plaincopy
-(void) pushViewB: (id) sender {
//初始化一个B类,view_B
view_B.view_A = self; //赋值
//推出View B
}
第四步:
在B类,假设在View B中做完所有操作之后,点击确定按钮,返回View A,并将数据传回给view A。假设这个确定按钮的方法是-(void)done: (id) sender。那么需要在这个方法中调用A类实现的viewAWillDoThisAction:
[plain] view plaincopy
-(void) done: (id) sender {
[self.view_A viewAWillDoThisAction:self];
//返回View A
}
上面代码注意两个问题:第一是调用view A的实现了delegate的方法,第二是将自身的指针传递给view A的方法,以方便view A能取到view B的数据。
以上就是整个利用delegate机制来进行两个view之间的传值的过程。这里注意一点:这两个view之间是有关系的(view A推出view B,从view B推出view A)。对于两个完全没有关系的view,如何传值呢?理论上利用delegate也是可以的,但并不是最好的方法。最好的方法是利用NSNotification,留到日后再说。
多嘴一点,其实说是利用delegate的方式来传值,其本质是传递类的指针来进行类成员的传值(实现了delegate的类A将自身传给了类B,然后类B又将自身传回去给类A),之所以用到delegate的机制,只不过是为了说明这个顺序:当B进行了某个操作的时候,需要A去做另外一件事。这就是delegate的本质。也就是我文章开头所说“最合理最自然”的原因。
UIWebView是iOS sdk中一个最常用的控件。是内置的浏览器控件,我们可以用它来浏览网页、打开文档等等。这篇文章我将使用这个控件,做一个简易的浏览器。如下图:
我们创建一个Window-based Application程序命名为:UIWebViewDemo
UIWebView的loadRequest可以用来加载一个url地址,它需要一个NSURLRequest参数。我们定义一个方法用来加载url。在UIWebViewDemoViewController中定义下面方法:
- (void)loadWebPageWithString:(NSString*)urlString
{
NSURL *url =[NSURLURLWithString:urlString];
NSLog(urlString);
NSURLRequest *request =[NSURLRequestrequestWithURL:url];
[webView loadRequest:request];
}
在界面上放置3个控件,一个textfield、一个button、一个uiwebview,布局如下:
在代码中定义相关的控件:webView用于展示网页、textField用于地址栏、activityIndicatorView用于加载的动画、buttonPress用于按钮的点击事件。
@interface UIWebViewDemoViewController :UIViewController<UIWebViewDelegate> { IBOutlet UIWebView *webView; IBOutlet UITextField *textField; UIActivityIndicatorView *activityIndicatorView;
} - (IBAction)buttonPress:(id) sender; - (void)loadWebPageWithString:(NSString*)urlString; @end |
使用IB关联他们。
设置UIWebView,初始化UIActivityIndicatorView:
- (void)viewDidLoad
{
[super viewDidLoad];
webView.scalesPageToFit =YES;
webView.delegate=self;
activityIndicatorView =[[UIActivityIndicatorView alloc]
initWithFrame :CGRectMake(0.0f, 0.0f,32.0f, 32.0f)];
[activityIndicatorView setCenter:self.view.center] ;
[activityIndicatorViewsetActivityIndicatorViewStyle: UIActivityIndicatorViewStyleWhite] ;
[self.view addSubview :activityIndicatorView] ;
[self buttonPress:nil];
// Do anyadditional setup after loading the view from its nib.
}
UIWebView主要有下面几个委托方法:
1、- (void)webViewDidStartLoad:(UIWebView*)webView;开始加载的时候执行该方法。 2、- (void)webViewDidFinishLoad:(UIWebView *)webView;加载完成的时候执行该方法。 3、- (void)webView:(UIWebView *)webViewdidFailLoadWithError:(NSError *)error;加载出错的时候执行该方法。
我们可以将activityIndicatorView放置到前面两个委托方法中。
- (void)webViewDidStartLoad:(UIWebView *)webView
{
[activityIndicatorView startAnimating] ;
}
- (void)webViewDidFinishLoad:(UIWebView *)webView
{
[activityIndicatorView stopAnimating];
}
buttonPress方法很简单,调用我们开始定义好的loadWebPageWithString方法就行了:
- (IBAction)buttonPress:(id) sender { [textField resignFirstResponder]; [self loadWebPageWithString:textField.text];
} |
当请求页面出现错误的时候,我们给予提示:
- (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error { UIAlertView *alterview = [[UIAlertView alloc] initWithTitle:@"" message:[error localizedDescription] delegate:nil cancelButtonTitle:nil otherButtonTitles:@"OK", nil]; [alterview show]; [alterview release]; } |