`

iOS5编程--官方例子代码的研究--2.UICatalog-3

 
阅读更多

6.TextViewController类

这里我们第一个关注的函数就是setupTextView
我把相应的注释写在下面,类似的其他的就不再解释。

self.textView = [[[UITextView alloc] initWithFrame:self.view.frame] autorelease];

使用alloc申请内存,并且指定位置。这里调用了autorelease,同时在dealloc函数中调用了[textView release];看似好像有问题的。因为内存管理的一个很重要的地方就是不能对一个内存计数器为0 的地址再次释放(造成的后果就是程序crash)。这里我们应该看到函数viewDidUnload的地方,self.textView = nil;因为viewDidUnload肯定早于dealloc被调用,所以在dealloc函数中,[textView release],相当于[nil release];在Objective-C中,任何发往nil的消息都会被忽略,不会造成任何后果。

但是我这里小声嘀咕一下,我认为这样的方式不是很好,我建议大家以后写代码的时候,这样的情况不要使用autorelease,同时在viewDidUnload中加入[self.textView release];在dealloc中不需要再次release这个指针。


self.textView.textColor = [UIColor blackColor];

设置文本的颜色,这里需要关注一下UIColor这个类,这个类的用法非常简单,看一下就可以了。

self.textView.font = [UIFont fontWithName:@"Arial" size:18.0];

这里是设置字体及大小,这个也是很简单,不过有时候我们会遇到如何设置自定义字体。

self.textView.delegate = self;

设置text view的delegate为自己。所谓delegate即是text view发生一些事件的时候的回调函数而已。

self.textView.backgroundColor = [UIColor whiteColor];

设置背景颜色。

self.textView.text = @"Now is the time for all good developers to come to serve their country.\n\nNow is the time for all good developers to come to serve their country.";

设置文本

self.textView.returnKeyType = UIReturnKeyDefault;

设置软件键盘的回车键。

self.textView.keyboardType = UIKeyboardTypeDefault; // use the default type input method (entire keyboard)

设置键盘。

self.textView.scrollEnabled = YES;

设置是否滚动。

// this will cause automatic vertical resize when the table is resized

self.textView.autoresizingMask = UIViewAutoresizingFlexibleHeight;

这个地方设置text view是否随父view一起调整大小。

// note: for UITextView, if you don't like autocompletion while typing use:

// myTextView.autocorrectionType = UITextAutocorrectionTypeNo;

这个设置是否自动更正输入内容。

[self.view addSubview: self.textView];

加载在view上。


这里需要加入一些关于view controller生命周期中几个重要函数的说明。

由init、loadView、viewDidLoad、viewDidUnload、dealloc的关系说起

init方法

  • 在init方法中实例化必要的对象(遵从LazyLoad思想)
  • init方法中初始化ViewController本身

loadView方法

  • 当view需要被展示而它却是nil时,viewController会调用该方法。不要直接调用该方法。
  • 如果手工维护views,必须重载重写该方法
  • 如果使用IB维护views,必须不能重载重写该方法
  • loadView和IB构建view

viewDidLoad方法

  • 重载重写该方法以进一步定制view
  • 在iPhone OS 3.0及之后的版本中,还应该重载重写viewDidUnload来释放对view的任何索引
  • viewDidLoad后调用数据Model

viewDidUnload方法

  • 当系统内存吃紧的时候会调用该方法(注:viewController没有被dealloc)
  • 内存吃紧时,在iPhone OS 3.0之前didReceiveMemoryWarning是释放无用内存的唯一方式,但是OS 3.0及以后viewDidUnload方法是更好的方式
  • 在该方法中将所有IBOutlet(无论是property还是实例变量)置为nil(系统release view时已经将其release掉了)
  • 在该方法中释放其他与view有关的对象、其他在运行时创建(但非系统必须)的对象、在viewDidLoad中被创建的对象、缓存数据等
  • release对象后,将对象置为nil(IBOutlet只需要将其置为nil,系统release view时已经将其release掉了)
  • 一般认为viewDidUnload是viewDidLoad的镜像,因为当view被重新请求时,viewDidLoad还会重新被执行
  • viewDidUnload中被release的对象必须是很容易被重新创建的对象(比如在viewDidLoad或其他方法中创建的对象),不要release用户数据或其他很难被重新创建的对象

dealloc方法

  • viewDidUnload和dealloc方法没有关联,dealloc还是继续做它该做的事情

viewWillAppear和viewDidDisappear这两个方法是view将要出现和消失的时候调用,

[[NSNotificationCenter defaultCenter] addObserver:self

selector:@selector(keyboardWillShow:)

name:UIKeyboardWillShowNotification

object:nil];

[[NSNotificationCenter defaultCenter] addObserver:self

selector:@selector(keyboardWillHide:)

name:UIKeyboardWillHideNotification

object:nil];

这里注册两个函数为系统事件的回调函数,一个事件UIKeyboardWillShowNotification是键盘将要出现。一个事件UIKeyboardWillHideNotification是键盘将要消失。

UIKeyboardWillShowNotification键盘将要出现的事件响应函数为:


- (void)keyboardWillShow:(NSNotification *)aNotification

{

参数为事件本身,除了这个参数,还可以加入一个参数,就是在addObserver的时候的object。上面传入的是nil。

// the keyboard is showing so resize the table's height

CGRect keyboardRect = [[[aNotification userInfo] objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue];

取得键盘的位置。

NSTimeInterval animationDuration =

[[[aNotification userInfo] objectForKey:UIKeyboardAnimationDurationUserInfoKey] doubleValue];

由于键盘出现是一个动画,动画的执行需要一定的时间,这里取得这个时间直。

CGRect frame = self.view.frame;

frame.size.height -= keyboardRect.size.height;

下面开始一个动画,动画我会在另外的例子中讲解,这里只需要知道,把view的大小变大,高度增加键盘的高度。加上上面的self.textView.autoresizingMask=UIViewAutoresizingFlexibleHeight;调用就可以出现输入的时候text view在输入东西过多的时候的自动滚动。可以试验一下。

[UIView beginAnimations:@"ResizeForKeyboard" context:nil];

[UIView setAnimationDuration:animationDuration];

self.view.frame = frame;

[UIView commitAnimations];

}

关于后面键盘消失的时候的回调函数,就不再讲述。

值得一提的时候,我们必须在合适的时候注销这些回调函数,这里就是view消失的时候。

其他的代码是关于导航栏的设置,会在导航例子中讲解。




分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics