[协议名] contains 字符串(或16进制),eg:
比如查找sip协议包含某个事务的所有报文,这个事务id的末尾几位对应的十六进制为:
67:61:62:72,就可以用sip contains 67:61:62:72来找到。
对于http协议可以简单的用http contains baidu.com来过滤
ip.addr == 10.0.0.1 [Sets a filter for any packet with 10.0.0.1, as either the source or dest]
2. ip.addr==10.0.0.1 && ip.addr==10.0.0.2 [sets a conversation filter between the two defined IP addresses]
3. http or dns [sets a filter to display all http and dns]
4. tcp.port==4000 [sets a filter for any TCP packet with 4000 as a source or dest port]
5. tcp.flags.reset==1 [displays all TCP resets]
6. http.request [displays all HTTP GET requests]
7. tcp contains traffic [displays all TCP packets that contain the word ‘traffic’. Excellent when searching on a specific string or user ID]
8. !(arp or icmp or dns) [masks out arp, icmp, dns, or whatever other protocols may be background noise. Allowing you to focus on the traffic of interest]
9. udp contains 33:27:58 [sets a filter for the HEX values of 0x33 0x27 0x58 at any offset]
10. tcp.analysis.retransmission [displays all retransmissions in the trace. Helps when tracking down slow application performance and packet loss]
在使用storyboard开发iOS应用时,从一个视图控制器的视图中点击一个按钮跳转到另外一个视图控制器的视图的操作开始使用segue实现。storyboard较之以前的nib最大的优点就是很直观地、图形化地展示各个视图控制器之间的关系。这个关系就是通过segue来实现。
通过segue,可以将一个视图控制器的数据传输到跳转到的另一个视图控制器上,再通过delegate是释放这个视图控制器并将新的数据传回来。这个segue的类型一般设置为modal。
(miki西游 @mikixiyou 原文链接: http://mikixiyou.iteye.com/blog/1751623
)
第一个视图控制器LoginViewController,用来显示登录窗口。它的视图中有两个textfield,用于录入用户名和密码,一个button,点击该button,通过拖到目标视图控制器上的segue来实现视图切换。
它的代码如下:
#import <UIKit/UIKit.h> @interface LoginViewController : UIViewController <UITextFieldDelegate> @property (weak, nonatomic) IBOutlet UITextField *usernameInput; @property (weak, nonatomic) IBOutlet UITextField *passwdInput; @end #import "LoginViewController.h" #import "LogoffViewController.h" @interface LoginViewController () <LogoffViewControllerDelegate> @end @implementation LoginViewController @synthesize usernameInput=_usernameInput,passwdInput=_passwdInput; - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. } -(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { if ([[segue identifier] isEqualToString:@"LogoffView"]) { LogoffViewController * logoffController=[segue destinationViewController]; logoffController.u01=self.usernameInput.text; logoffController.u02=self.passwdInput.text; logoffController.delegate=self; } } -(void)logoffViewControllerDone:(LogoffViewController *)controller username:(NSString *)username passwd:(NSString *)passwd { [self dismissViewControllerAnimated:YES completion:NULL]; NSLog(@"username is %@",username); } - (BOOL)textFieldShouldReturn:(UITextField *)textField { if ((textField == self.usernameInput) || (textField == self.passwdInput)) { [textField resignFirstResponder]; } return YES; } @end
在prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender方法中,实现目标视图控制器属性的设置,实际上是将数据传输到目标视图控制器上,并设置目标视图控制器的委托为自己。
这样通过这个委托可以再切换回来。
在logoffViewControllerDone:(LogoffViewController *)controller username:(NSString *)username passwd:(NSString *)passwd方法中,实现目标控制器的委托的方法。
它会被目标视图控制器调用,将目标视图控制器的数据传过来,并释放目标视图控制器。
第二个视图控制器LogoffViewController,用来显示前一个视图控制器的切换窗口,有两个lable用来显示传输过来的用户名和密码信息,一个button用来释放自己,并回到前一个视图控制器窗口。
#import <UIKit/UIKit.h> @protocol LogoffViewControllerDelegate; @interface LogoffViewController : UIViewController @property (strong,nonatomic) NSString *u01,*u02; @property (weak, nonatomic) IBOutlet UILabel *username; @property (weak, nonatomic) IBOutlet UILabel *passwd; @property (weak,nonatomic) id <LogoffViewControllerDelegate> delegate; - (IBAction)logOff:(id)sender; @end @protocol LogoffViewControllerDelegate <NSObject> -(void)logoffViewControllerDone:(LogoffViewController *)controller username:(NSString *)username passwd:(NSString *)passwd; @end #import "LogoffViewController.h" @implementation LogoffViewController @synthesize u01=_u01,u02=_u02; @synthesize delegate=_delegate; @synthesize username=_username,passwd=_passwd; - (void)viewDidLoad { [super viewDidLoad]; self.username.text=[NSString stringWithFormat:@"username is %@", self.u01]; self.passwd.text=self.u02; } - (IBAction)logOff:(id)sender { [[self delegate] logoffViewControllerDone:self username:self.username.text passwd:self.passwd.text]; } @end
在接口定义中,定义有一个delegate对象,这是用来和源视图控制器交互的。delegate实现了两个对象在松耦合的情况下进行交互。
在方法实现中,增加viewDidLoad方法的功能,显示在源视图控制器中在prepareForSegue:sender:方法里已经设置好属性u01/u02的值。viewDidLoad方法是视图控制器加载视图时执行的方法。一些界面设置工作都在这里完成。
方法logOff:用来实现窗口中logoff按钮的目标的动作。该方法实际上是调用的它的委托也就是源视图控制器中的logoffViewControllerDone:(LogoffViewController *)controller username:(NSString *)username passwd:(NSString *)passwd方法。
在写个程序时,遇到NSUnknownKeyException错误,主要信息如下:
2012-12-20 21:17:08.646 BirdWatching[1609:11303] *** Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<LogoffViewController 0x75efa70> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key userName.'
这个错误发生在prepareForSegue:sender:方法执行结束时。
显然在LogoffViewController视图控制器上没有userName这个属性。这个属性是我之前定义的,后来删除掉了。
在storyboard中,还有连接这个userName属性的outlet。
这个问题在反复删除时会出现,不知道算不算是storyboard的bug。对于我这个初学者而言,折腾了很久。但也学会了XCODE的debug功能,它其实也就是个gdb调试工具。
这个借segue切换视图控制器的操作过程,和UIViewController中的方法presentViewController:animated:completion:和dismissViewControllerAnimated:completion:很类似。怀疑它的内部实现也是用这两个方法来实现的。
http://beforweb.com/node/134
大家周四下午好。打破每周日上一篇译文的规矩,临时来一发。今天刚刚看到的东西,很简短的图文,介绍了一个蛮赞的交互模式,于是把拿来把译文做掉,特别推荐给交互设计师们。走你!
移动应用的设计师们一直在努力降低用户的输入量。屏幕太小了,手指无法精准触摸,输入过程中产生错误简直是家常便饭。输入量是无法被无限制的降低的,很多时候我们更需要考虑的是怎样使输入变得更加容易。
输入蒙板是一种限制内容格式、避免输入错误的方式。举个例子,我们可以使电话号码输入框只接受数字内容,而不对其它任何类型的字符做出响应。所接纳的数字也可以被限定在某个范围或模式当中。不过,输入蒙板的功能不仅限于防错,它同样可以被用在更加“积极”的地方,例如将多项输入内容合并为一个逻辑序列,使用户不必在多个输入框中来回切换。
最近我(英文原文作者)在Square的iPhone应用(Square Wallet)当中见到的输入方式就蛮有意思的,用户在一个输入框当中就可以完成信用卡类型、卡号、有效期、CVV号(卡片背后的3位数字)和邮政编码的填写。
输入框当中的最左端是一个代表信用卡的图标,主要内容部分用于输入卡号,蒙板规则是典型的4位分隔。随着用户的输入,系统会根据卡号判断卡片的类别,例如VISA或MasterCard,并相应的改变左侧的信用卡图标。这种方式帮用户省掉了一个选择卡片类型的步骤,而且是一种很积极的信息回馈方式,让用户能够感受到系统对他们的操作产生了响应(相关阅读:为用户的成功操作提供正面反馈)。
当用户正确的完成了16位卡号的填写,文本框会自动改变显示模式,之前输入的卡号只会显示出最后的4位,节省出的3个字段就分配给了有效期、CVV码和邮编。用户在键入这些内容的时候同样会得到输入蒙板的辅助,例如格式限定、日期有效性的判定、自动添加斜杠、自动聚焦到下一个字段等。
这里有一个很棒的细节,当用户在输入CVV码时,左侧的图标会发生变化(如上图所示),提示用户所谓的CVV码就是卡片背后的3位数字;非常贴心。
目前看来人们对这套交互模式的反响很好;这简直是一定的。只用到一个文本框,即有效的利用了输入蒙板的防错与辅助功能,又极大减少了传统模式当中文本框的使用量——Squre给力!
另外值得一提的是,Zachary Forrest通过前端技术将这套交互模式“移植”到了Web端,有兴趣的朋友们也不妨去围观。
本文整合编译自两篇相关文章:Collecting Payment Information Within a Single Input和Making beautiful forms; Square and Recurly