您的位置:首页 > 编程语言

oc常用代码整理

2016-03-07 17:13 387 查看
常用代码整理:
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设置居上对齐,居中对齐,居下对齐

在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;
参考:iOS组件之UILabel

iOS UILabel详解
/article/8575912.html

·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]];

UITextField的总结

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;

}

UISlider滑块控件

一、创建
滑块是一个标准的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];

UISegmentedControl的所有操作总结

#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

使用Delegate实现不同页面间的传值

两个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的基本用法,适合新手

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];
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: