iPhone和iPod touch的键盘颜色其实是可以通过代码更改的,这样能更匹配App的界面风格,下面是改变iPhone键盘颜色的代码。
- (void)textFieldDidBeginEditing:(UITextField *)textField{ NSArray *ws = [[UIApplication sharedApplication] windows]; for(UIView *w in ws){ NSArray *vs = [w subviews]; for(UIView *v in vs){ if([[NSString stringWithUTF8String:object_getClassName(v)] isEqualToString:@"UIPeripheralHostView"]){ v.backgroundColor = [UIColor redColor]; } } } }
1、只有Number Pad和Phone Pad这两种数字键盘才有效果
2、设置Appearance为Alert
效果图:
最近在做ipad的MVC开发框架当设计接口函数时发现层与层之间的数据交互是以前没有考虑清楚的。在分层架构中要尽量减小层与层之间的耦合,层与层之间的通讯需要考虑正常数据的传输,一般采用DTO数据传输对象来实现,需要考虑业务逻辑错误,比如说:用户Session失效,用户名密码错误等,一般在通讯协议中会定义不同的错误代码表,需要考虑程序异常,在Java实现中一般采用异常处理。归纳起来在层与层之间传输的数据包括3种类型:正常返回数据/错误处理提示/程序异常。
层与层之间的通讯方式也可以分为几种:最常见的是基于方法调用,逐层进行方法调用,通过方法的返回值传递业务数据和异常。另外还可以采用基于消息的通讯方式,层与层之间采用命令(Command)方式发起请求和处理感兴趣的命令和数据。两种方式都面临处理上面的3种数据传输的问题,大家是如何来做的呢?
首先,基于命令的模式看起来对这三种数据的处理是非常容易的,命令发布者可以把这3类数据封装成统一的消息,消息订阅者只需要根据消息类型进行处理即可。而基于方法调用的模式相对来说就比较复杂一些了,在Java实现中一般采用方法返回值来处理正常数据的传输,通过异常来处理错误信息和程序异常信息。那么在ios开发中又是如何来实现的呢?
如果是基于命令模式的实现ios和java应该没有太大的区别,在方法调用的实现方式上就显得大为不同。首先从接触ios开发以来发现ios开发中很少使用异常处理,而是通过函数返回BOOL值来判断函数执行的结果。通过阅读文档发现ios提供了一种叫做“Error handling Programming”的技术来实现函数中对异常和错误的处理。总体来看在ios开发中处理层与层的数据交互方面感觉还是很困难的,可能是做java比较久的缘故吧。
总结一下目前见到的几种ios开发中实现方式:
1.看到更多的程序都是业务逻辑和显示都写在UIViewController中,通过共享变量的 方式来实现数据交互,这种模式简单适合小的项目开发。
2.稍好一点的将交互数据提取出一个单独的类,在类中持有数据和状态以及错误代 码,通过共享类变量来达到数据交互的目的。
3.将错误信息和正常数据封装在一个DTO中返回。
4.将NSError作为参数放在函数最后,通过NSError返回错误信息,也就是Error handling Programming方法。
几种方法相比较而言Error handling Programming方法更加OO一些,方法2应用更广泛一些。个人而言更推荐使用Command模式来实现层与层之间的数据交互。
例子:
public class HandlerActivity extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Button b1 = (Button)findViewById(R.id.button1); Button b2 = (Button)findViewById(R.id.button2); b1.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { //立即把线程加入消息队列中 handler.post(r); } }); b2.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { //停止线程 handler.removeCallbacks(r); } }); } Handler handler = new Handler(); /** *该方法的内部类将在handler.sendMessage(msg)后执行 Handler handler = new Handler(){ @Override public void handleMessage(Message msg) { System.out.println("msg:"+msg.arg1); } }; */ Runnable r = new Runnable() { @Override public void run() { System.out.println("sysout Thread"); //得到一个消息对象,Message类是有Android系统 Message msg = handler.obtainMessage(); //将msg对象arg1参数设置为122,用arg1和arg2传递消息 //优点是系统资源消耗较小 msg.arg1 = 122; //将消息加入到另外一个消息队列中去 handler.sendMessage(msg); //3000毫秒后加入线程到消息队列中 handler.postDelayed(r, 3000); } }; }
PS:Handler有两个消息队列,一个是post线程队列,另一个是message消息队列,两个队列的方法是异步的。handler匿名内部类方法是在handler.sendMessage(msg)后执行。
Thread.currentThread().getId()和Thread.currentThread().getName()是得到当前线程Id和Name的方法
Handler.post方法和Runnable是处于同一个线程(重要!!)