精华内容
参与话题
问答
  • IOS开发笔记

    千次阅读 2013-08-01 21:39:11
    1 iphone开发笔记 2 3 退回输入键盘 4 - (BOOL) textFieldShouldReturn:(id)textField{ 5 [textField resignFirstResponder]; 6 } 7 8 CGRect 9 CGRect frame = CGRectMake (origin.x, orig
    
    
    复制代码
       1 iphone开发笔记
       2 
       3 退回输入键盘
       4   - (BOOL) textFieldShouldReturn:(id)textField{
       5     [textField  resignFirstResponder];
       6 }
       7  
       8 CGRect
       9 CGRect frame = CGRectMake (origin.x, origin.y, size.width, size.height);矩形
      10 NSStringFromCGRect(someCG) 把CGRect结构转变为格式化字符串;
      11 CGRectFromString(aString) 由字符串恢复出矩形;
      12 CGRectInset(aRect) 创建较小或较大的矩形(中心点相同),+较小  -较大
      13 CGRectIntersectsRect(rect1, rect2) 判断两矩形是否交叉,是否重叠
      14 CGRectZero 高度和宽度为零的/位于(00)的矩形常量
      15  
      16 CGPoint & CGSize
      17 CGPoint aPoint = CGPointMake(x, y);    
      18 CGSize aSize = CGSizeMake(width, height);
      19  
      20 设置透明度
      21 [myView setAlpha:value];   (0.0 < value < 1.0)
      22 
      23 设置背景色 
      24 [myView setBackgroundColor:[UIColor redColor]]; 
      25  (blackColor;darkGrayColor;lightGrayColor;
      26 whiteColor;grayColor; redColor; greenColor; 
      27 blueColor; cyanColor;yellowColor;
      28 magentaColor;orangeColor;purpleColor;
      29 brownColor; clearColor; )
      30 
      31 自定义颜色
      32 UIColor *newColor = [[UIColor alloc]
      33  initWithRed:(float) green:(float) blue:(float) alpha:(float)]; 
      34      0.0~1.0
      35 
      36 竖屏
      37 320X480
      38 
      39 横屏
      40 480X320    
      41 
      42 状态栏高 (显示时间和网络状态)
      43 20 像素   
      44 
      45 导航栏、工具栏高(返回)
      46 44像素
      47 
      48 隐藏状态栏
      49 [[UIApplication shareApplication] setStatusBarHidden: YES animated:NO]
      50  
      51 横屏
      52 [[UIApplication shareApplication] 
      53 setStatusBarOrientation:UIInterfaceOrientationLandscapeRight].
      54 
      55 屏幕变动检测
      56 orientation == UIInterfaceOrientationLandscapeLeft
      57 
      58 全屏
      59 window=[[UIWindow alloc] initWithFrame:[UIScreen mainScreen] bounds]; 
      60  
      61 自动适应父视图大小:
      62 aView.autoresizingSubviews = YES;
      63 aView.autoresizingMask = (UIViewAutoresizingFlexibleWidth | 
      64                        UIViewAutoresizingFlexibleHeight);
      65  
      66  定义按钮
      67 UIButton *scaleUpButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
      68 [scaleUpButton setTitle:@"放 大" forState:UIControlStateNormal];
      69 scaleUpButton.frame = CGRectMake(40, 420, 100, 40);
      70 [scaleUpButton addTarget:self
      71  action:@selector(scaleUp) 
      72 forControlEvents:UIControlEventTouchUpInside];
      73  
      74 设置视图背景图片
      75 UIImageView *aView;
      76 [aView setImage:[UIImage imageNamed:@”name.png”]];
      77 view1.backgroundColor = [UIColor colorWithPatternImage:
      78 [UIImage imageNamed:@"image1.png"]];
      79  
      80 自定义UISlider的样式和滑块
      81 
      82 我们使用的是UISlider的setMinimumTrackImage,和setMaximumTrackImage方法来定义图片的,这两个方法可以设置滑块左边和右边的图片的,不过如果用的是同一张图片且宽度和控件宽度基本一致,就不会有变形拉伸的后果,先看代码,写在 viewDidLoad中:
      83     //左右轨的图片
      84     UIImage *stetchLeftTrack= [UIImage imageNamed:@"brightness_bar.png"];
      85     UIImage *stetchRightTrack = [UIImage imageNamed:@"brightness_bar.png"];
      86     //滑块图片
      87     UIImage *thumbImage = [UIImage imageNamed:@"mark.png"];
      88     
      89     UISlider *sliderA=[[UISlider alloc]initWithFrame:CGRectMake(30, 320, 257, 7)];
      90     sliderA.backgroundColor = [UIColor clearColor];
      91     sliderA.value=1.0;
      92     sliderA.minimumValue=0.7;
      93     sliderA.maximumValue=1.0;
      94     
      95     [sliderA setMinimumTrackImage:stetchLeftTrack forState:UIControlStateNormal];
      96     [sliderA setMaximumTrackImage:stetchRightTrack forState:UIControlStateNormal];
      97     //注意这里要加UIControlStateHightlighted的状态,否则当拖动滑块时滑块将变成原生的控件
      98     [sliderA setThumbImage:thumbImage forState:UIControlStateHighlighted];
      99     [sliderA setThumbImage:thumbImage forState:UIControlStateNormal];
     100     //滑块拖动时的事件
     101     [sliderA addTarget:self action:@selector(sliderValueChanged:) forControlEvents:UIControlEventValueChanged];
     102     //滑动拖动后的事件
     103     [sliderA addTarget:self action:@selector(sliderDragUp:) forControlEvents:UIControlEventTouchUpInside];
     104     
     105     [self.view addSubview:sliderA]; 
     106  
     107 为了大家实验方便,我附上背景图brightness_bar.png和滑块图mark.png
     108 http://pic002.cnblogs.com/images/2011/162291/2011121611431816.png
     109 http://pic002.cnblogs.com/images/2011/162291/2011121611432897.png
     110 
     111  -(IBAction)sliderValueChanged:(id)sender{
     112 UISlider *slider = (UISlider *) sender;
     113 NSString *newText = [[NSString alloc] initWithFormat:@”%d”, (int)(slider.value + 0.5f)];
     114 label.text = newText;
     115 }
     116  
     117 活动表单 
     118 <UIActionSheetDelegate>
     119 
     120  - (IBActive) someButtonPressed:(id) sender
     121 {
     122     UIActionSheet *actionSheet = [[UIActionSheet alloc] 
     123                     initWithTitle:@”Are you sure?”
     124                     delegate:self
     125                     cancelButtonTitle:@”No way!”
     126                     destructiveButtonTitle:@”Yes, I’m Sure!”
     127                     otherButtonTitles:nil];
     128     [actionSheet showInView:self.view];
     129     [actionSheet release];
     130 }
     131  
     132 警告视图 
     133  <UIAlertViewDelegate>
     134 
     135  - (void) actionSheet:(UIActionSheet *)actionSheet didDismissWithButtonIndex:(NSInteger) buttonIndex
     136 {
     137      if(buttonIndex != [actionSheet cancelButtonIndex])
     138      {
     139           NSString *message = [[NSString alloc] initWithFormat:@”You can          
     140                    breathe easy, everything went OK.”];
     141           UIAlertView *alert = [[UIAlertView alloc]    
     142                                initWithTitle:@”Something was done”
     143                                 message:message
     144                                 delegate:self
     145                                 cancelButtonTitle:@”OK”
     146                                 otherButtonTitles:nil];
     147           [alert show];
     148           [alert release];
     149           [message release];
     150      }
     151 }
     152  
     153 动画效果
     154 -(void)doChange:(id)sender
     155 {
     156 if(view2 == nil)
     157 {
     158 [self loadSec];
     159 }
     160 [UIView beginAnimations:nil context:NULL];
     161 [UIView setAnimationDuration:1];        
     162 [UIView setAnimationTransition:([view1 superview]?UIViewAnimationTransitionFlipFromLeft:UIViewAnimationTransitionFlipFromRight)forView:self.view cache:YES];
     163    
     164     if([view1 superview]!= nil)
     165 {
     166 [view1 removeFromSuperview];
     167 [self.view addSubview:view2];
     168  
     169 }else {
     170  
     171 [view2 removeFromSuperview];
     172 [self.view addSubview:view1];
     173 }
     174 [UIView commitAnimations];
     175 }
     176  
     177 Table View   <UITableViewDateSource>
     178 #pragma mark -
     179 #pragma mark Table View Data Source Methods
     180 //指定分区中的行数,默认为1
     181 - (NSInteger)tableView:(UITableView *)tableView 
     182  numberOfRowsInSection:(NSInteger)section
     183 {
     184 return [self.listData count];
     185 }
     186  
     187 //设置每一行cell显示的内容
     188 - (UITableViewCell *)tableView:(UITableView *)tableView 
     189 cellForRowAtIndexPath:(NSIndexPath *)indexPath
     190 {
     191 static NSString *SimpleTableIndentifier = @"SimpleTableIndentifier";
     192 UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:SimpleTableIndentifier];
     193 if (cell == nil) {
     194 cell = [[[UITableViewCell alloc] 
     195 initWithStyle:UITableViewCellStyleSubtitle 
     196 reuseIdentifier:SimpleTableIndentifier] 
     197 autorelease];
     198 }
     199      UIImage *image = [UIImage imageNamed:@"13.gif"];
     200 cell.imageView.image = image;
     201      
     202 NSUInteger row = [indexPath row];
     203 cell.textLabel.text = [listData objectAtIndex:row];
     204      cell.textLabel.font = [UIFont boldSystemFontOfSize:20];
     205  
     206      if(row < 5)
     207 cell.detailTextLabel.text = @"Best friends";
     208 else 
     209     cell.detailTextLabel.text = @"friends";
     210 return cell;
     211 }
     212 
     213 图像、文本标签和详细文本标签
     214 
     215 图像:如果设置图像,则它显示在文本的左侧; 文本标签:这是单元的主要文本(UITableViewCellStyleDefault 只显示文本标签);详细文本标签:这是单元的辅助文本,通常用作解释性说明或标签
     216 
     217 UITableViewCellStyleSubtitle
     218 UITableViewCellStyleDefault
     219 UITableViewCellStyleValue1
     220 UITableViewCellStyleValue2
     221  
     222 <UITableViewDelegate>
     223 #pragma mark -
     224 #pragma mark Table View Delegate Methods
     225 //把每一行缩进级别设置为其行号
     226 - (NSInteger)tableView:(UITableView *)tableView indentationLevelForRowAtIndexPath:(NSIndexPath *)indexPath
     227 {
     228 NSUInteger row = [indexPath row];
     229 return row;
     230 }
     231 //获取传递过来的indexPath值
     232 - (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath
     233 {
     234 NSUInteger row = [indexPath row];
     235 if (row == 0) 
     236 return nil;
     237 return indexPath;
     238 }
     239  
     240 - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
     241 {
     242 NSUInteger row = [indexPath row];
     243 NSString *rowValue = [listData objectAtIndex:row];
     244 NSString *message = [[NSString alloc] initWithFormat:@"You selected %@",rowValue];
     245 UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Row Selected"
     246 message:message
     247     delegate:nil
     248   cancelButtonTitle:@"Yes, I did!"
     249   otherButtonTitles:nil];
     250 [alert show];
     251 [alert release];
     252 [message release];
     253 [tableView deselectRowAtIndexPath:indexPath animated:YES];
     254 }
     255  
     256 //设置行的高度
     257 - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
     258 {
     259 return 40;
     260 }
     261 
     262 NavigationController 推出push 推出pop
     263 [self.navigationController pushViewController:_detailController animated:YES];
     264 [self.navigationController popViewControllerAnimated:YES];
     265  
     266 Debug:
     267 NSLog(@"%s %d", __FUNCTION__, __LINE__);
     268  
     269 点击textField外的地方回收键盘
     270 
     271 先定义一个UIControl类型的对象,在上面可以添加触发事件,令SEL实践为回收键盘的方法,最后将UIControl的实例加到当前View上。
     272 UIControl *m_control = [[UIControl alloc] initWithFrame:CGRectMake(0, 0, 320, 480)];
     273 [m_control addTarget:self action:@selector(keyboardReturn) 
     274 forControlEvents:UIControlEventTouchUpInside];
     275 [self.view addSubview:m_control];
     276  
     277 - (void) keyboardReturn
     278 {
     279 [aTextField resignFirstResponder];
     280 }
     281  
     282 键盘覆盖输入框
     283 当键盘调出时将输入框覆盖时,可以用下方法:
     284 - (BOOL)textFieldShouldBeginEditing:(UITextField *)textField
     285 {
     286 [self.view setFrame:CGRectMake(0, -100, 320, 480) ];
     287 return YES;
     288 }
     289 - (BOOL)textFieldShouldEndEditing:(UITextField *)textField
     290 {
     291   [self.view setFrame:CGRectMake(0, 0, 320, 480)];
     292     return YES;
     293 }
     294 当准备输入时,将视图的位置上调100,这样键盘就不能覆盖到输入框。
     295  
     296 当依赖注入方法不好使时,可以在AppDelegate内申明一个全局的控制器实例_anotherViewController,在另一个需要使用_anotherViewController的地方定义以下委托方法,使用共享的UIApplication实例来获取该委托的引用
     297 SomeAppDelegate *appDelegate = (SomeAppDelegate *)[[UIApplication sharedApplication] delegate];
     298 _anotherViewController = appDelegate._anotherViewController; 
     299 
     300 UIViewController内建Table View
     301 
     302 纯代码在UIViewController控制器内建Table View
     303 @interface RootViewController : UIViewController <UITableViewDelegate, UITableViewDataSource> {
     304 NSArray *timeZoneNames;
     305 }
     306 @property (nonatomic,retain) NSArray *timeZoneNames;
     307 @end
     308  
     309 (void) loadView
     310 {
     311 UITableView *tableView = [[UITableView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame]] style: UITableViewStylePlain];
     312 tableView.autoresizingMask = (UIViewAutoresizingFlexibleHeight | UIViewAutoresizingWidth);
     313 tableView.delegate = self;
     314 tableView.dataSource = self;
     315 [tableView reloadData];
     316  
     317 self.view = tableView;
     318 [tableView release];
     319 }
     320  
     321  
     322 将plist文件中的数据赋给数组
     323 NSString *thePath = [[NSBundle mainBundle] pathForResource:@"States" ofType:@"plist"];
     324 NSArray *array = [NSArray arrayWithContentsOfFile:thePath];
     325  
     326 UITouch
     327 手指的触摸范围:64X64 
     328  
     329 #pragma mark -
     330 #pragma mark Touch Events
     331  
     332 - (void)touchesBegan:(NSSet *) touches withEvent:(UIEvent *) event {
     333 originFrame = bookCover.frame;
     334 NSLog(@"%s %d", __FUNCTION__,__LINE__);
     335  
     336 if ([touches count] == 2) 
     337 {
     338 NSArray *twoTouches = [touches allObjects];
     339 UITouch *firstTouch = [twoTouches objectAtIndex:0];
     340 UITouch *secondTouch = [twoTouches objectAtIndex:1];
     341 CGPoint firstPoint = [firstTouch locationInView:bookCover];
     342 CGPoint secondPoint = [secondTouch locationInView:bookCover];
     343  
     344 CGFloat deltaX = secondPoint.x - firstPoint.x;
     345 CGFloat deltaY = secondPoint.y - firstPoint.y; 
     346 initialDistance = sqrt(deltaX * deltaX + deltaY * deltaY ); 
     347 frameX = bookCover.frame.origin.x;
     348 frameY = bookCover.frame.origin.y;
     349 frameW = bookCover.frame.size.width;
     350 frameH = bookCover.frame.size.height;
     351 NSLog(@"%s %d", __FUNCTION__,__LINE__);
     352 }
     353 }
     354  
     355 - (void)touchesMoved:(NSSet *) touches withEvent:(UIEvent *) event { 
     356  
     357 if([touches count] == 2)
     358 { 
     359 NSLog(@"%s %d", __FUNCTION__,__LINE__);
     360  
     361 NSArray *twoTouches = [touches allObjects];
     362 UITouch *firstTouch = [twoTouches objectAtIndex:0];
     363 UITouch *secondTouch = [twoTouches objectAtIndex:1];
     364  
     365 CGPoint firstPoint = [firstTouch locationInView:bookCover];
     366 CGPoint secondPoint = [secondTouch locationInView:bookCover];
     367  
     368 CGFloat deltaX = secondPoint.x - firstPoint.x;
     369 CGFloat deltaY = secondPoint.y - firstPoint.y; 
     370 CGFloat currentDistance = sqrt(deltaX * deltaX + deltaY * deltaY ); 
     371  
     372 if (initialDistance == 0) {
     373 initialDistance = currentDistance;
     374 }
     375 else if (currentDistance != initialDistance)
     376 {
     377 CGFloat changedDistance = currentDistance - initialDistance;
     378 NSLog(@"changedDistance = %f",changedDistance);
     379 [bookCover setFrame:CGRectMake(frameX - changedDistance / 2, 
     380 frameY - (changedDistance * frameH) / (2 * frameW),
     381 frameW + changedDistance, 
     382 frameH + (changedDistance * frameH) / frameW)];
     383 }
     384 }
     385 }
     386  
     387 - (void)touchesEnded:(NSSet *) touches withEvent:(UIEvent *) event {
     388 UITouch *touch = [touches anyObject];
     389  
     390 UITouch双击图片变大/还原
     391 if ([touch tapCount] == 2) 
     392 {
     393 NSLog(@"%s %d", __FUNCTION__,__LINE__);
     394  
     395 if (!flag) {
     396 [bookCover setFrame:CGRectMake(bookCover.frame.origin.x - bookCover.frame.size.width / 2,
     397 bookCover.frame.origin.y - bookCover.frame.size.height / 2,
     398 2 * bookCover.frame.size.width, 
     399 2 * bookCover.frame.size.height)];
     400 flag = YES;
     401 }
     402 else {
     403 [bookCover setFrame:CGRectMake(bookCover.frame.origin.x + bookCover.frame.size.width / 4, bookCover.frame.origin.y + bookCover.frame.size.height / 4,
     404 bookCover.frame.size.width / 2, bookCover.frame.size.height / 2)]; 
     405 flag = NO;
     406 }
     407 } 
     408 }
     409 
     410 Get the Location of Touches
     411 (CGPoint)locationInView:(UIView *)view
     412 (CGPoint)previousLocationInView:(UIView *)view
     413 view window
     414  
     415 Getting Touch Attributes
     416 tapCount(read only) timestamp(read only) phase(read only)
     417  
     418 Getting a Touch Object's Gesture Recognizers
     419 gestureRecognizers 
     420  
     421 Touch Phase
     422 UITouchPhaseBegan
     423 UITouchPhaseMoved
     424 UITouchPhaseStationary
     425 UITouchPhaseEnded
     426 UITouchPhaseCancelled
     427  
     428 从Plist里读内容
     429 NSString *plistPath = [[NSBundle mainBundle] pathForResource:@"book" ofType:@"plist"];
     430 NSDictionary *dictionary = [[NSDictionary alloc] initWithContentsOfFile:plistPath];
     431 NSString *book = [dictionary objectForKey:bookTitle];
     432 [textView setText:book];
     433  
     434 (void) initialize {
     435 NSUserDefaults = [NSUserDefaults standardUserDefaults];
     436 NSDictionary *appDefaults = [NSDictionary dictionaryWithObject:@"YES" forKey:@"DeleteBackup"];
     437 [defaults registerDefaults:appDefaults];
     438 }
     439  
     440 To get a value of a default, use the valueForKey: method:
     441 [[theDefaultsController values] valueForKey:@"userName"];
     442 To set a value for a default, use setValue:forKey:
     443 [[theDefaultsController values] setValue:newUserName forKey:@"userName"];
     444  
     445 [[NSUserDefaults standardUserDefaults] setValue:aVale forKey:aKey];
     446 [[NSUserDefaults standardUserDefaults] valueForKey:aKey];
     447  
     448 获取Documents目录
     449 NSArray *paths = NSSearchPathForDictionariesInDomains(NSDocumentDirectory, 
     450 NSUserDomainMask, YES);
     451 NSString *documentsDirectory = [paths objectAtIndex:0];
     452 NSString *filename = [documentsDirectory 
     453 stringByAppendingPathComponent:@"theFile.txt"];
     454  
     455 获取tmp目录
     456 NSString *tempPath = NSTemporaryDirectory();
     457 NSString *tempFile = [tempPath stringByAppendingPathComponent:@"tempFile.txt"];
     458  
     459 [[NSUserDefaults standardUserDefaults] setObject:data forKey:@"someKey"];
     460 [[NSUserDefaults standardUserDefaults] objectForKey:aKey];
     461 
     462 自定义NavigationBar
     463 navigationBar = [[UINavigationBar alloc] initWithFrame:CGRectMake(0, 0, 320, 44)];
     464 [navigationBar setBarStyle:UIBarStyleBlackOpaque];
     465  
     466 myNavigationItem = [[UINavigationItem alloc] initWithTitle:@"Setting"];
     467 [navigationBar setItems:[NSArray arrayWithObject:myNavigationItem]];
     468 [self.view addSubview:navigationBar];
     469  
     470 backButton = [[UIBarButtonItem alloc] initWithTitle:@"Back" style:UIBarButtonItemStylePlain target:self action:@selector(back)];
     471 myNavigationItem.leftBarButtonItem = backButton;
     472  
     473  
     474 利用Safari打开一个链接
     475 NSURL *url = [NSURL URLWithString:@"http://www.cnblogs.com/tracy-e/"];
     476 [[UIApplication sharedApplication] openURL:url];
     477  
     478 利用UIWebView显示pdf文件、网页。。。
     479 webView = [[UIWebView alloc] initWithFrame:CGRectMake(0, 0, 320, 480)];
     480 [webView setDelegate:self];
     481 [webView setScalesPageToFit:YES];
     482 [webView setAutoresizingMask:UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight];
     483 [webView setAllowsInlineMediaPlayback:YES];
     484 [self.view addSubview:webView];
     485 NSString *pdfPath = [[NSBundle mainBundle] pathForResource:@"ojc" ofType:@"pdf"]; 
     486 NSURL *url = [NSURL fileURLWithPath:pdfPath]; 
     487 NSURLRequest *request = [NSURLRequest requestWithURL:url 
     488 cachePolicy:NSURLRequestUseProtocolCachePolicy
     489 timeoutInterval:5];
     490 [webView loadRequest:request];
     491  
     492  
     493 [myWebView loadRequest:[NSURLRequest requestWithURL:[NSURL 
     494                        URLWithString: @"http://www.cnblogs.com/tracy-e/"]]];
     495  
     496 NSString *errorString = [NSString stringWithFormat:@"<html><center><font size= 
     497 +5 color ='red'>An Error Occurred:<br>%@</fone></center></html>",error];
     498 [myWebView loadHTMLString:errorString baseURL:nil];
     499  
     500 //Stopping a load request when the view is to disappear
     501 - (void)viewWillDisappear:(BOOL)animate{
     502 if ([myWebView loading]){
     503 [myWebView stopLoading];
     504 }
     505 myWebView.delegate = nil;
     506 [UIApplication shareApplication].networkActivityIndicatorVisible = NO;
     507 }
     508  
     509 汉字转码
     510 NSString *oriString = @"\u67aa\u738b";
     511 NSString *escapedString = [oriString 
     512 stringByReplacingPercentEscapesUsingEncoding: NSUTF8StringEncoding];
     513  
     514  
     515 Checking for background support on earlier versions of iOS
     516 UIDevice *device = [UIDevice currentDevice];
     517 BOOL backgroundSupported = NO;
     518 if ([device respondsToSelector:@selector(isMultitaskingSupported)]){
     519 backgroundSupported = device.multitaskingSupported;
     520 }
     521  
     522 Being a Responsible,Multitasking-Aware Application 
     523 # Do not make any OpenGL ES calls from your code.
     524 # Cancel any Bonjour-related services before being suspended.
     525 # Be prepared to handle connection failures in your network-based sockets.
     526 # Save your application state before moving to the background.
     527 # Release any unneeded memory when moving to the background.
     528 # Stop using shared system resources before being suspended.
     529 # Avoid updating your windows and views.
     530 # Respond to connect and disconnect notification for external accessories.
     531 # Clean up resource for active alerts when moving to the background.
     532 # Remove sensitive information from views before moving to the background.
     533 # Do minimal work while running in the background.
     534  
     535 Handing the Keyboard notifications
     536 //Call this method somewhere in your view controller setup code
     537 - (void) registerForKeyboardNotifications{
     538  
     539 [[NSNotificationCenter defaultCenter] addObserver:self
     540 selector:@selector(keyboardWasShown:)
     541 name:UIKeyboardDidShowNotification 
     542 object:nil];
     543 [[NSNotificationCenter defaultCenter] addObserver:self
     544 selector:@selector(keyboardWasHidden:)
     545 name:UIKeyboardDidHideNotification
     546 object:nil];
     547  
     548 }
     549  
     550 //Called when the UIKeyboardDidShowNotification is sent
     551 - (void)keyboardWasShown:(NSNotification *) aNotification{
     552 if(keyboardShown)
     553 return;
     554 NSDictionary *info = [aNotification userInfo];
     555  
     556 //get the size of the keyboard. 
     557 NSValue *aValue = [info objectForKey:UIKeyboardFrameBeginUserInfoKey];
     558 CGSize keyboardSize = [aValue CGRectValue].size;
     559  
     560 //Resize the scroll view 
     561 CGRect viewFrame = [scrollView frame];
     562 viewFrame.size.height -= keyboardSize.height;
     563  
     564 //Scroll the active text field into view
     565 CGRect textFieldRect = [activeField frame];
     566 [scrollView scrollRectToVisible:textFieldRect animated:YES];
     567  
     568 keyboardShown = YES; 
     569 }
     570  
     571 //Called when the UIKeyboardDidHideNotification is sent
     572 - (void)keyboardWasHidden:(NSNotification *) aNotification{
     573 NSDictionary *info = [aNotification userInfo];
     574  
     575 //Get the size of the keyboard.
     576 NSValue *aValue = [info objectForKey:UIKeyboardFrameEndUserInfoKey];
     577 CGSize keyboardSize = [aValue CGRectValue].size;
     578  
     579 //Reset the height of the scroll view to its original value
     580 CGRect viewFrame = [scrollView Frame];
     581 viewFrame.size.height += keyboardSize.height;
     582 scrollView.frame = viewFrame;
     583  
     584 keyboardShown = NO;
     585 }
     586  
     587 点击键盘的next按钮,在不同的textField之间换行
     588 //首先给不同的textField赋不同的且相邻的tag值
     589 - (BOOL)textFieldShouldReturn:(UITextField *)textField
     590 {
     591 if ([textField returnKeyType] != UIReturnKeyDone)
     592 { 
     593 NSInteger nextTag = [textField tag] + 1;
     594 UIView *nextTextField = [[self tableView] viewWithTag:nextTag];
     595 [nextTextField becomeFirstResponder];
     596 }
     597 else {
     598 [textField resignFirstResponder];
     599 }
     600 return YES;
     601 } 
     602  
     603 Configuring a date formatter 
     604 - (void)viewDidLoad {
     605 [super viewDidLoad];
     606 dateFormatter = [[NSDateFormatter alloc] init];
     607 [dateFormatter setGeneratesCalendarDates:YES];
     608 [dateFormatter setLocale:[NSLocale currentLocale]];
     609 [dateFormatter setCalendar:[NSCalendar autoupdatingCurrentCalendar]];
     610 [dateFormatter setTimeZone:[NSTimeZone defaultTimeZone]];
     611 [dateFormatter setDateStyle:NSDateFormatterShortStyle];
     612 DOB.placeholder = [NSString stringWithFormat:@"Example: %@",[dateFormatter stringFromDate:[NSDate date]]];
     613 }
     614  
     615 - (void)textFieldDidEndEditing:(UITextField *)textField{
     616 [textField resignFirstResponder];
     617 if ([textField.text isEqualToString:@""])
     618 return;
     619 switch (textField.tag){
     620 case DOBField:
     621 NSDate *theDate = [dateFormatter dateFromString:textField.text];
     622 if (theDate)
     623 [inputDate setObject:theDate forKey:MyAppPersonDOBKey];
     624 break;
     625 default:
     626 break;
     627 }
     628 }
     629  
     630  tableView的cell高度
     631 
     632 tableView的cell高度除了在delegate中指定外,还可以在任意位置以[tableView setRowHeight:44]的方式指定
     633  
     634 [[self navigationItem] setLeftBarButtonItem:[self editButtonItem]];
     635  
     636 - (void)setEditing:(BOOL)editing animated:(BOOL)animated{
     637 [super setEditing:editing animated:animated];
     638 if (editing){
     639 ...... 
     640 }
     641 else{
     642 ......
     643 } 
     644 }
     645  
     646 One added a subview to a view, release the subview to avoid the extra retain count of it, Because when you insert a view as a subview using addSubview:, the subview is retained by its superview. When you remove the subview from its superview using the removeFromSuperview: method, subview is autoreleased.
     647 
     648 为UINavigationBar设置背景图片
     649 在iPhone开发中, 有时候我们想给导航条添加背景图片, 实现多样化的导航条效果, 用其他方法往往无法达到理想的效果, 经过网上搜索及多次实验, 确定如下最佳实现方案:
     650 为UINavigatonBar增加如下Category(类别:提供一种为某个类添加方法而又不必编写子类的途径,类别只能添加成员函数,不能添加数据成员):
     651 
     652 @implementation UINavigationBar (CustomImage)  
     653 - (void)drawRect:(CGRect)rect {  
     654     UIImage *image = [UIImage imageNamed: @"NavigationBar.png"];  
     655     [image drawInRect:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)];  
     656 }  
     657 @end  
     658  
     659 例如, 在我的项目中, 添加如下代码:
     660 /  
     661 /* input: The image and a tag to later identify the view */  
     662 @implementation UINavigationBar (CustomImage)  
     663 - (void)drawRect:(CGRect)rect {  
     664     UIImage *image = [UIImage imageNamed: @"title_bg.png"];  
     665     [image drawInRect:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)];  
     666 }  
     667 @end  
     668 /  
     669 @implementation FriendsPageViewController  
     670 // Implement viewDidLoad to do additional setup after loading the view, typically from a nib.  
     671 - (void)viewDidLoad {     
     672     self.navigationBar.tintColor = [UIColor purpleColor];  
     673       
     674     [self initWithRootViewController:[[RegPageViewController alloc] init]];  
     675     [super viewDidLoad];  
     676 }  
     677 ......  
     678 实现的效果如下图:
     679   
     680  
     681 转载,原文地址 http://blog.csdn.net/wave_1102/archive/2009/11/04/4768212.aspx
     682 
     683 为UINavigationBar添加自定义背景
     684 
     685 @implementation UINavigationBar (UINavigationBarCategory)  
     686 
     687 - (void)drawRect:(CGRect)rect {  
     688     //颜色填充  
     689 //  UIColor *color = [UIColor redColor];  
     690 //  CGContextRef context = UIGraphicsGetCurrentContext();  
     691 //  CGContextSetFillColor(context, CGColorGetComponents( [color CGColor]));  
     692 //  CGContextFillRect(context, rect);  
     693 //  self.tintColor = color;  
     694     //图片填充  
     695 UIColor *color = [UIColor colorWithRed:46.0f/255.0f 
     696 green:87.0f/255.0f blue:29.0f/255.0f alpha:1.0f];
     697 
     698     UIImage *img    = [UIImage imageNamed: @"bg.png"];  
     699     [img drawInRect:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)];  
     700 
     701     self.tintColor = color;  
     702 }  
     703 
     704 @end
     705 
     706 加载图片要及时release
     707 
     708 你还在使用myImage = [UIImage imageNamed:@"icon.png"]; 吗? 
     709 
     710 如题,是不是大家为了方便都这样加载图片啊
     711 
     712 myImage = [UIImage imageNamed:@"icon.png"];
     713 
     714 那么小心了
     715 
     716 这种方法在一些图片很少,或者图片很小的程序里是ok的。
     717 
     718 但是,在大量加载图片的程序里,请千万不要这样做。
     719 
     720 为什么呢 ???????
     721 
     722 这种方法在application bundle的顶层文件夹寻找由供应的名字的图象。 如果找到图片,装载到iPhone系统缓存图象。那意味图片是(理论上)放在内存里作为cache的。
     723 
     724 试想你图片多了,是什么后果? 
     725 
     726 图片cache极有可能不会响应 memory warnings and release its objects
     727 
     728 所以,用图片的时候一定要小心的alloc和release。
     729 
     730 推荐使用 NSString *path = [[NSBundle mainBundle] pathForResource:@"icon" ofType:@"png"];
     731 
     732 myImage = [UIImage imageWithContentsOfFile:path];
     733 
     734 // Todo use of myImage
     735 
     736 [myImage release];
     737 
     738 From: http://www.cocoachina.com/bbs/simple/?t27420.html 
     739 
     740 uiwebview打开doc,pdf文件
     741 UIWebView *webView = [[UIWebView alloc]initWithFrame:CGRectMake(0, 55, 320, 300)];
     742     webView.delegate = self;
     743     webView.multipleTouchEnabled = YES;
     744     webView.scalesPageToFit = YES;
     745 
     746     NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
     747     NSString *documentsDirectory = [paths objectAtIndex:0];
     748     NSString *docPath = [documentsDirectory stringByAppendingString:@"/doc2003_1.doc"];    NSLog(@"#######%@",docPath);
     749     
     750     NSURL *url = [NSURL fileURLWithPath:docPath];
     751     NSURLRequest *request = [NSURLRequest requestWithURL:url];
     752     [webView loadRequest:request];
     753     
     754     [self.view addSubview:webView];
     755 [webView release];
     756 
     757 From:http://blog.csdn.net/dadalan/archive/2010/10/22/5959301.aspx 
     758 
     759 iPhone游戏中既播放背景音乐又播放特效声音的办法
     760 
     761 有时候在 iPhone 游戏中,既要播放背景音乐,同时又要播放比如枪的开火音效。此时您可以试试以下方法
     762 
     763     NSString *musicFilePath = [[NSBundle mainBundle] pathForResource:fileName ofType:@"wav"];       //创建音乐文件路径
     764     NSURL *musicURL = [[NSURL alloc] initFileURLWithPath:musicFilePath];  
     765     AVAudioPlayer* musicPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:musicURL error:nil];
     766     [musicURL release];
     767     [musicPlayer prepareToPlay];
     768     //[musicPlayer setVolume:1];            //设置音量大小
     769     //musicPlayer .numberOfLoops = -1;//设置音乐播放次数  -1为一直循环
     770 
     771 要导入框架 AVFoundation.framework,头文件中 #import <AVFoundation/AVFoundation.h>;做成类的话则更方便。
     772 
     773 From: http://blog.csdn.net/dadalan/archive/2010/10/19/5950493.aspx 
     774 
     775 NSNotificationCenter用于增加回调函数
     776 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(_willBecomeActive) name:UIApplicationDidBecomeActiveNotification object:nil];
     777 
     778 UINavigationBar 背景Hack
     779 LOGO_320×44.png 图片显示在背景上,
     780 
     781 @implementation UINavigationBar (UINavigationBarCategory)
     782 - (void)drawRect:(CGRect)rect {
     783     //加入旋转坐标系代码
     784     // Drawing code    
     785     UIImage *navBarImage = [UIImage imageNamed:@"LOGO_320×44.png"];
     786     CGContextRef context = UIGraphicsGetCurrentContext();
     787     CGContextTranslateCTM(context, 0.0, self.frame.size.height);
     788     CGContextScaleCTM(context, 1.0, -1.0);    
     789     
     790     CGPoint center=self.center;
     791 
     792     CGImageRef cgImage= CGImageCreateWithImageInRect(navBarImage.CGImage, CGRectMake(0, 0, 1, 44));
     793     CGContextDrawImage(context, CGRectMake(center.x-160-80, 0, 80, self.frame.size.height), cgImage);
     794     CGContextDrawImage(context, CGRectMake(center.x-160, 0, 320, self.frame.size.height), navBarImage.CGImage);
     795     CGContextDrawImage(context, CGRectMake(center.x+160, 0, 80, self.frame.size.height), cgImage);
     796 }
     797 @end
     798 
     799 old code
     800 CGContextDrawImage(context, CGRectMake(0, 0, self.frame.size.width, self.frame.size.height), navBarImage.CGImage);
     801 
     802 hack 过logo 不再拉伸
     803  
     804 From: http://blog.163.com/fengyi1103@126/blog/static/13835627420106279102671/ 
     805 
     806 清除电话号码中的其他符号(源码)
     807 
     808 最近从通讯录读取电话号码,读出得号码如:134-1814-****。
     809 而我需要的为11位纯数字,一直找方法解决此问题,今天终于找到了。。
     810 分享一下……
     811 
     812 代码如下:
     813 
     814 NSString *originalString = @"(123) 123123 abc";
     815 NSMutableString *strippedString = [NSMutableString 
     816         stringWithCapacity:originalString.length];
     817 
     818 NSScanner *scanner = [NSScanner scannerWithString:originalString];
     819 NSCharacterSet *numbers = [NSCharacterSet 
     820         characterSetWithCharactersInString:@"0123456789"];
     821 
     822 while ([scanner isAtEnd] == NO) {
     823   NSString *buffer;
     824   if ([scanner scanCharactersFromSet:numbers intoString:&buffer]) {
     825     [strippedString appendString:buffer];
     826   }
     827   // --------- Add the following to get out of endless loop
     828   else {
     829      [scanner setScanLocation:([scanner scanLocation] + 1)];
     830   }    
     831   // --------- End of addition
     832 }
     833 
     834 NSLog(@"%@", strippedString); // "123123123"
     835 
     836 From: http://stackoverflow.com/questions/1129521/remove-all-but-numbers-from-nsstring 
     837 
     838 
     839 正则判断:字符串只包含字母和数字
     840 
     841 NSString *mystring = @"Letter1234";
     842 NSString *regex = @"[a-z][A-Z][0-9]";
     843 
     844 NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regex];
     845 
     846 if ([predicate evaluateWithObject:mystring] == YES) {
     847     //implement
     848 }
     849 
     850 
     851 一行代码设置 UITableViewCell 与导航条间距
     852 
     853 UITableView 的 cell 默认出现在 uitableview 的第一行,如果你想自定义 UITableViewCell 与导航条间距的话,可以使用下面这行代码
     854 
     855 tableview.tableHeaderView = [[[UIView alloc] initWithFrame:CGRectMake(0, 0, 5, 20)]autorelease];
     856 
     857 From: http://blog.163.com/fengyi1103@126/blog/static/1383562742010101611107492/ 
     858 
     859 
     860 修改 UITableview 滚动条颜色的方法
     861 
     862     UITableview 的滚动条默认颜色是黑色的,如果 UItableview 背景也是深颜色,则滚动条会变的很不明显。您可以用下面这行代码来改变滚动条的颜色
     863 
     864 self.tableView.indicatorStyle=UIScrollViewIndicatorStyleWhite;
     865 
     866 当然,最后的 “White” 也可以换成其它颜色。
     867 
     868 
     869 下文件之前获取到文件大小的代码
     870 
     871 下面这段代码,能实现在下载文件之前获得文件大小,应用在软件里,能在很大程度上改善用户体验
     872 
     873 [m_pASIHTTPRequest setDidReceiveResponseHeadersSelector:@selector(didReceiveResponseHeaders:)];
     874 
     875 - (void)didReceiveResponseHeaders:(ASIHTTPRequest *)request
     876 {
     877     NSLog(@"didReceiveResponseHeaders %@",[m_request.responseHeaders valueForKey:@"Content-Length"]);
     878  879 
     880 网络编程总结 iphone
     881 
     882 一:确认网络环境3G/WIFI
     883 
     884     1. 添加源文件和framework
     885     
     886     开发Web等网络应用程序的时候,需要确认网络环境,连接情况等信息。如果没有处理它们,是不会通过Apple的审(我们的)查的。
     887     Apple 的 例程 Reachability 中介绍了取得/检测网络状态的方法。要在应用程序程序中使用Reachability,首先要完成如下两部:
     888     
     889     1.1. 添加源文件:
     890     在你的程序中使用 Reachability 只须将该例程中的 Reachability.h 和 Reachability.m 拷贝到你的工程中。如下图:
     891 
     892     
     893     
     894     1.2.添加framework:
     895     将SystemConfiguration.framework 添加进工程。如下图:
     896     
     897     
     898     2. 网络状态
     899     
     900     Reachability.h中定义了三种网络状态:
     901     typedef enum {
     902         NotReachable = 0,            //无连接
     903         ReachableViaWiFi,            //使用3G/GPRS网络
     904         ReachableViaWWAN            //使用WiFi网络
     905     } NetworkStatus;
     906     
     907     因此可以这样检查网络状态:
     908 
     909     Reachability *r = [Reachability reachabilityWithHostName:@“www.apple.com”];
     910     switch ([r currentReachabilityStatus]) {
     911             case NotReachable:
     912                     // 没有网络连接
     913                     break;
     914             case ReachableViaWWAN:
     915                     // 使用3G网络
     916                     break;
     917             case ReachableViaWiFi:
     918                     // 使用WiFi网络
     919                     break;
     920     }
     921     
     922     3.检查当前网络环境
     923     程序启动时,如果想检测可用的网络环境,可以像这样
     924     // 是否wifi
     925     + (BOOL) IsEnableWIFI {
     926         return ([[Reachability reachabilityForLocalWiFi] currentReachabilityStatus] != NotReachable);
     927     }
     928 
     929     // 是否3G
     930     + (BOOL) IsEnable3G {
     931         return ([[Reachability reachabilityForInternetConnection] currentReachabilityStatus] != NotReachable);
     932     }
     933     例子:
     934     - (void)viewWillAppear:(BOOL)animated {    
     935     if (([Reachability reachabilityForInternetConnection].currentReachabilityStatus == NotReachable) && 
     936             ([Reachability reachabilityForLocalWiFi].currentReachabilityStatus == NotReachable)) {
     937             self.navigationItem.hidesBackButton = YES;
     938             [self.navigationItem setLeftBarButtonItem:nil animated:NO];
     939         }
     940     }
     941 
     942     4. 链接状态的实时通知
     943     网络连接状态的实时检查,通知在网络应用中也是十分必要的。接续状态发生变化时,需要及时地通知用户:
     944     
     945     Reachability 1.5版本
     946     // My.AppDelegate.h
     947     #import "Reachability.h"
     948 
     949     @interface MyAppDelegate : NSObject <UIApplicationDelegate> {
     950         NetworkStatus remoteHostStatus;
     951     }
     952 
     953     @property NetworkStatus remoteHostStatus;
     954 
     955     @end
     956 
     957     // My.AppDelegate.m
     958     #import "MyAppDelegate.h"
     959 
     960     @implementation MyAppDelegate
     961     @synthesize remoteHostStatus;
     962 
     963     // 更新网络状态
     964     - (void)updateStatus {
     965         self.remoteHostStatus = [[Reachability sharedReachability] remoteHostStatus];
     966     }
     967 
     968     // 通知网络状态
     969     - (void)reachabilityChanged:(NSNotification *)note {
     970         [self updateStatus];
     971         if (self.remoteHostStatus == NotReachable) {
     972             UIAlertView *alert = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"AppName", nil)
     973                          message:NSLocalizedString (@"NotReachable", nil)
     974                         delegate:nil cancelButtonTitle:@"OK" otherButtonTitles: nil];
     975             [alert show];
     976             [alert release];
     977         }
     978     }
     979 
     980     // 程序启动器,启动网络监视
     981     - (void)applicationDidFinishLaunching:(UIApplication *)application {
     982     
     983         // 设置网络检测的站点
     984         [[Reachability sharedReachability] setHostName:@"www.apple.com"];
     985         [[Reachability sharedReachability] setNetworkStatusNotificationsEnabled:YES];
     986         // 设置网络状态变化时的通知函数
     987         [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(reachabilityChanged:)
     988                                                  name:@"kNetworkReachabilityChangedNotification" object:nil];
     989         [self updateStatus];
     990     }
     991 
     992     - (void)dealloc {
     993         // 删除通知对象
     994         [[NSNotificationCenter defaultCenter] removeObserver:self];
     995         [window release];
     996         [super dealloc];
     997     } 
     998     
     999     Reachability 2.0版本
    1000     
    1001 
    1002     // MyAppDelegate.h
    1003     @class Reachability;
    1004 
    1005         @interface MyAppDelegate : NSObject <UIApplicationDelegate> {
    1006             Reachability  *hostReach;
    1007         }
    1008 
    1009     @end
    1010 
    1011     // MyAppDelegate.m
    1012     - (void)reachabilityChanged:(NSNotification *)note {
    1013         Reachability* curReach = [note object];
    1014         NSParameterAssert([curReach isKindOfClass: [Reachability class]]);
    1015         NetworkStatus status = [curReach currentReachabilityStatus];
    1016     
    1017         if (status == NotReachable) {
    1018             UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"AppName""
    1019                               message:@"NotReachable"
    1020                               delegate:nil
    1021                               cancelButtonTitle:@"YES" otherButtonTitles:nil];
    1022                               [alert show];
    1023                               [alert release];
    1024         }
    1025     }
    1026                               
    1027     - (void)applicationDidFinishLaunching:(UIApplication *)application {
    1028         // ...
    1029                   
    1030         // 监测网络情况
    1031         [[NSNotificationCenter defaultCenter] addObserver:self
    1032                               selector:@selector(reachabilityChanged:)
    1033                               name: kReachabilityChangedNotification
    1034                               object: nil];
    1035         hostReach = [[Reachability reachabilityWithHostName:@"www.google.com"] retain];
    1036         hostReach startNotifer];
    1037         // ...
    1038     }
    1039 
    1040 
    1041 二:使用NSConnection下载数据
    1042     
    1043     1.创建NSConnection对象,设置委托对象
    1044     
    1045     NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:[self urlString]]];
    1046     [NSURLConnection connectionWithRequest:request delegate:self];
    1047     
    1048     2. NSURLConnection delegate委托方法
    1049         - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response;  
    1050         - (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error;  
    1051         - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data;  
    1052         - (void)connectionDidFinishLoading:(NSURLConnection *)connection;  
    1053 
    1054     3. 实现委托方法
    1055     - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {
    1056         // store data
    1057         [self.receivedData setLength:0];            //通常在这里先清空接受数据的缓存
    1058     }
    1059     
    1060     - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
    1061            /* appends the new data to the received data */
    1062         [self.receivedData appendData:data];        //可能多次收到数据,把新的数据添加在现有数据最后
    1063     }
    1064 
    1065     - (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error {
    1066         // 错误处理
    1067     }
    1068 
    1069     - (void)connectionDidFinishLoading:(NSURLConnection *)connection {
    1070         // disconnect
    1071         [UIApplication sharedApplication].networkActivityIndicatorVisible = NO;   
    1072         NSString *returnString = [[NSString alloc] initWithData:self.receivedData encoding:NSUTF8StringEncoding];
    1073         NSLog(returnString);
    1074         [self urlLoaded:[self urlString] data:self.receivedData];
    1075         firstTimeDownloaded = YES;
    1076     }
    1077 
    1078 三:使用NSXMLParser解析xml文件
    1079 
    1080     1. 设置委托对象,开始解析
    1081     NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data];   //或者也可以使用initWithContentsOfURL直接下载文件,但是有一个原因不这么做:
    1082     // It's also possible to have NSXMLParser download the data, by passing it a URL, but this is not desirable
    1083     // because it gives less control over the network, particularly in responding to connection errors.
    1084     [parser setDelegate:self];
    1085     [parser parse];
    1086 
    1087     2. 常用的委托方法
    1088     - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName 
    1089                                 namespaceURI:(NSString *)namespaceURI
    1090                                 qualifiedName:(NSString *)qName 
    1091                                 attributes:(NSDictionary *)attributeDict;
    1092     - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName 
    1093                                 namespaceURI:(NSString *)namespaceURI 
    1094                                 qualifiedName:(NSString *)qName;
    1095     - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string;
    1096     - (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError;
    1097 
    1098     static NSString *feedURLString = @"http://www.yifeiyang.net/test/test.xml";
    1099 
    1100     3.  应用举例
    1101     - (void)parseXMLFileAtURL:(NSURL *)URL parseError:(NSError **)error
    1102     {
    1103         NSXMLParser *parser = [[NSXMLParser alloc] initWithContentsOfURL:URL];
    1104         [parser setDelegate:self];
    1105         [parser setShouldProcessNamespaces:NO];
    1106         [parser setShouldReportNamespacePrefixes:NO];
    1107         [parser setShouldResolveExternalEntities:NO];
    1108         [parser parse];
    1109         NSError *parseError = [parser parserError];
    1110         if (parseError && error) {
    1111             *error = parseError;
    1112         }
    1113         [parser release];
    1114     }
    1115 
    1116     - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI 
    1117                                         qualifiedName:(NSString*)qName attributes:(NSDictionary *)attributeDict{
    1118         // 元素开始句柄
    1119         if (qName) {
    1120             elementName = qName;
    1121         }
    1122         if ([elementName isEqualToString:@"user"]) {
    1123             // 输出属性值
    1124             NSLog(@"Name is %@ , Age is %@", [attributeDict objectForKey:@"name"], [attributeDict objectForKey:@"age"]);
    1125         }
    1126     }
    1127 
    1128     - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI 
    1129                                         qualifiedName:(NSString *)qName
    1130     {
    1131         // 元素终了句柄
    1132         if (qName) {
    1133                elementName = qName;
    1134         }
    1135     }
    1136 
    1137     - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
    1138     {
    1139         // 取得元素的text
    1140     }
    1141 
    1142     NSError *parseError = nil;
    1143     [self parseXMLFileAtURL:[NSURL URLWithString:feedURLString] parseError:&parseError];
    1144 
    1145 Iphone 实现画折线图
    1146 
    1147 iphone里面要画图一般都是通过CoreGraphics.framwork和QuartzCore.framwork实现,apple的官方sdk demon中包含了QuartzCore的基本用法,
    1148 
    1149     
    1150 具体demo请参考http://developer.apple.com/library/ios/#samplecode/QuartzDemo/
    1151 折线图
    1152 
    1153 
    1154 要实现折线图也就把全部的点连起来,movePointLineto,具体的调用里面的api就可以实现了,但是画坐标就比较麻烦了,里面需要去转很多,好在国外有人开源了一个画折线图的开发包,首先看看效果吧,具体怎么用可以参考作者git版本库中的wiki。
    1155 http://github.com/devinross/tapkulibrary/wiki/How-To-Use-This-Library
    1156    
    1157 这个包还提供了其他的很好看的UI,都可以调来用,但是我们只需要一个画图要把整个包都导进去,工程太大了,既然是开源的那就想办法提取出来吧,原先之前也有人干过这样的事。http://duivesteyn.net/2010/03/07/iphone-sdk-implementing-the-tapku-graph-in-your-application/
    1158 我对源代码进行简单的修改,使其显示坐标之类的,更加符合工程的需要,但是还没有实现画多组数据,只能画一组数据,不用viewContol,而使用addsubview,直接添加到当前的窗口,最终效果如下。
    1159 使用方法:
    1160 
    1161 1.工程添加tk库里面的如下文件
    1162  
    1163 2. 添加QuartzCore  framework 
    1164 #import <QuartzCore/QuartzCore.h>
    1165 添加TapkuLibrary.bundle资源文件
    1166 3.代码中完成实例,数据初始化就可以用了
    1167  
    1168 下载修改后的版本。下次有时间在整理一个工程版本出来。
    1169 
    1170 让iPhone屏幕常亮不变暗的方法
    1171 
    1172 如果您希望运行自己开发的App时,iPhone的屏幕不再自动变暗,可以使用以下方法让屏幕常亮: iPhone OS用一个布尔值用来控制是否取消应用程序空闲时间:@property(nonatomic, getter=isIdleTime 
    1173  
    1174 如果您希望运行自己开发的App时,iPhone的屏幕不再自动变暗,可以使用以下方法让屏幕常亮:
    1175 
    1176   iPhone OS用一个布尔值用来控制是否取消应用程序空闲时间:@property(nonatomic, getter=isIdleTimerDisabled) BOOL idleTimerDisabled。这个值的默认属性是"NO"。当大多数应用程序没有接收到用户输入信息的时候,系统会把设备设置成“休眠”状态,iPhone屏幕也会变暗。这样做是为了保存更多电量。事实上,应用程序在运行加速度游戏的时候是不需要用户输入的,当然这里只是一个假设,把这个变量设置为"YES",来取消系统休眠的“空闲时间”。
    1177 
    1178 重点是:你必须当真正需要的时候才打开这个属性当你不用的时候马上还愿成"NO"。大多数应用程序在休眠时间到的时候让系统关闭屏幕。这个包括了有音频的应用程 序。在Audio Session Services中使用适当的回放和记录功能不会被间断当屏幕关闭时。只有地图应用程序,游戏或者一些不间断的用户交互程序可以取消这个属性。
    1179 
    1180 苹果开发网络编程知识总结
    1181 
    1182 以下苹果开发网络编程知识由 CocoaChina 会员 cocoa_yang 总结,希望能为苹果开发新手梳理知识脉络,节省入门时间。一:确认网络环境3G/WIFI 1. 添加源文件和framework 开发Web等网络应用程序 
    1183 
    1184   以下苹果开发网络编程知识由 CocoaChina 会员 “cocoa_yang” 总结,希望能为苹果开发新手梳理知识脉络,节省入门时间。
    1185 
    1186 一:确认网络环境3G/WIFI
    1187 
    1188     1. 添加源文件和framework
    1189     
    1190     开发Web等网络应用程序的时候,需要确认网络环境,连接情况等信息。如果没有处理它们,是不会通过Apple的审查的。
    1191     Apple 的 例程 Reachability 中介绍了取得/检测网络状态的方法。要在应用程序程序中使用Reachability,首先要完成如下两部:
    1192     
    1193     1.1. 添加源文件:
    1194     在你的程序中使用 Reachability 只须将该例程中的 Reachability.h 和 Reachability.m 拷贝到你的工程中。如下图:
    1195     
    1196     1.2.添加framework:
    1197     将SystemConfiguration.framework 添加进工程。如下图:
    1198     
    1199     
    1200     2. 网络状态
    1201     
    1202     Reachability.h中定义了三种网络状态:
    1203     typedef enum {
    1204         NotReachable = 0,            //无连接
    1205         ReachableViaWiFi,            //使用3G/GPRS网络
    1206         ReachableViaWWAN            //使用WiFi网络
    1207     } NetworkStatus;
    1208     
    1209     因此可以这样检查网络状态:
    1210 
    1211     Reachability *r = [Reachability reachabilityWithHostName:@“www.apple.com”];
    1212     switch ([r currentReachabilityStatus]) {
    1213             case NotReachable:
    1214                     // 没有网络连接
    1215                     break;
    1216             case ReachableViaWWAN:
    1217                     // 使用3G网络
    1218                     break;
    1219             case ReachableViaWiFi:
    1220                     // 使用WiFi网络
    1221                     break;
    1222     }
    1223     
    1224     3.检查当前网络环境
    1225 
    1226     程序启动时,如果想检测可用的网络环境,可以像这样
    1227     // 是否wifi
    1228     + (BOOL) IsEnableWIFI {
    1229         return ([[Reachability reachabilityForLocalWiFi] currentReachabilityStatus] != NotReachable);
    1230     }
    1231 
    1232     // 是否3G
    1233     + (BOOL) IsEnable3G {
    1234         return ([[Reachability reachabilityForInternetConnection] currentReachabilityStatus] != NotReachable);
    1235     }
    1236     例子:
    1237     - (void)viewWillAppear:(BOOL)animated {    
    1238     if (([Reachability reachabilityForInternetConnection].currentReachabilityStatus == NotReachable) &&
    1239             ([Reachability reachabilityForLocalWiFi].currentReachabilityStatus == NotReachable)) {
    1240             self.navigationItem.hidesBackButton = YES;
    1241             [self.navigationItem setLeftBarButtonItem:nil animated:NO];
    1242         }
    1243     }
    1244 
    1245     4. 链接状态的实时通知
    1246 
    1247     网络连接状态的实时检查,通知在网络应用中也是十分必要的。接续状态发生变化时,需要及时地通知用户:
    1248     
    1249     Reachability 1.5版本
    1250     // My.AppDelegate.h
    1251     #import "Reachability.h"
    1252 
    1253     @interface MyAppDelegate : NSObject <UIApplicationDelegate> {
    1254         NetworkStatus remoteHostStatus;
    1255     }
    1256 
    1257     @property NetworkStatus remoteHostStatus;
    1258 
    1259     @end
    1260 
    1261     // My.AppDelegate.m
    1262     #import "MyAppDelegate.h"
    1263 
    1264     @implementation MyAppDelegate
    1265     @synthesize remoteHostStatus;
    1266 
    1267     // 更新网络状态
    1268     - (void)updateStatus {
    1269         self.remoteHostStatus = [[Reachability sharedReachability] remoteHostStatus];
    1270     }
    1271 
    1272     // 通知网络状态
    1273     - (void)reachabilityChanged:(NSNotification *)note {
    1274         [self updateStatus];
    1275         if (self.remoteHostStatus == NotReachable) {
    1276             UIAlertView *alert = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"AppName", nil)
    1277                          message:NSLocalizedString (@"NotReachable", nil)
    1278                         delegate:nil cancelButtonTitle:@"OK" otherButtonTitles: nil];
    1279             [alert show];
    1280             [alert release];
    1281         }
    1282     }
    1283 
    1284     // 程序启动器,启动网络监视
    1285     - (void)applicationDidFinishLaunching:(UIApplication *)application {
    1286     
    1287         // 设置网络检测的站点
    1288         [[Reachability sharedReachability] setHostName:@"www.apple.com"];
    1289         [[Reachability sharedReachability] setNetworkStatusNotificationsEnabled:YES];
    1290         // 设置网络状态变化时的通知函数
    1291         [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(reachabilityChanged:)
    1292                                                  name:@"kNetworkReachabilityChangedNotification" object:nil];
    1293         [self updateStatus];
    1294     }
    1295 
    1296     - (void)dealloc {
    1297         // 删除通知对象
    1298         [[NSNotificationCenter defaultCenter] removeObserver:self];
    1299         [window release];
    1300         [super dealloc];
    1301     }
    1302     
    1303     Reachability 2.0版本
    1304     
    1305 
    1306     // MyAppDelegate.h
    1307     @class Reachability;
    1308 
    1309         @interface MyAppDelegate : NSObject <UIApplicationDelegate> {
    1310             Reachability  *hostReach;
    1311         }
    1312 
    1313     @end
    1314 
    1315     // MyAppDelegate.m
    1316     - (void)reachabilityChanged:(NSNotification *)note {
    1317         Reachability* curReach = [note object];
    1318         NSParameterAssert([curReach isKindOfClass: [Reachability class]]);
    1319         NetworkStatus status = [curReach currentReachabilityStatus];
    1320     
    1321         if (status == NotReachable) {
    1322             UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"AppName""
    1323                               message:@"NotReachable"
    1324                               delegate:nil
    1325                               cancelButtonTitle:@"YES" otherButtonTitles:nil];
    1326                               [alert show];
    1327                               [alert release];
    1328         }
    1329     }
    1330                               
    1331     - (void)applicationDidFinishLaunching:(UIApplication *)application {
    1332         // ...
    1333                   
    1334         // 监测网络情况
    1335         [[NSNotificationCenter defaultCenter] addObserver:self
    1336                               selector:@selector(reachabilityChanged:)
    1337                               name: kReachabilityChangedNotification
    1338                               object: nil];
    1339         hostReach = [[Reachability reachabilityWithHostName:@"www.google.com"] retain];
    1340         hostReach startNotifer];
    1341         // ...
    1342     }
    1343 
    1344 
    1345 二:使用NSConnection下载数据
    1346     
    1347     1.创建NSConnection对象,设置委托对象
    1348     
    1349     NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:[self urlString]]];
    1350     [NSURLConnection connectionWithRequest:request delegate:self];
    1351     
    1352     2. NSURLConnection delegate委托方法
    1353         - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response;  
    1354         - (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error;  
    1355         - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data;  
    1356         - (void)connectionDidFinishLoading:(NSURLConnection *)connection;  
    1357 
    1358     3. 实现委托方法
    1359     - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {
    1360         // store data
    1361         [self.receivedData setLength:0];            //通常在这里先清空接受数据的缓存
    1362     }
    1363     
    1364     - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
    1365            /* appends the new data to the received data */
    1366         [self.receivedData appendData:data];        //可能多次收到数据,把新的数据添加在现有数据最后
    1367     }
    1368 
    1369     - (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error {
    1370         // 错误处理
    1371     }
    1372 
    1373     - (void)connectionDidFinishLoading:(NSURLConnection *)connection {
    1374         // disconnect
    1375         [UIApplication sharedApplication].networkActivityIndicatorVisible = NO;  
    1376         NSString *returnString = [[NSString alloc] initWithData:self.receivedData encoding:NSUTF8StringEncoding];
    1377         NSLog(returnString);
    1378         [self urlLoaded:[self urlString] data:self.receivedData];
    1379         firstTimeDownloaded = YES;
    1380     }
    1381 
    1382 三:使用NSXMLParser解析xml文件
    1383 
    1384     1. 设置委托对象,开始解析
    1385     NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data];   //或者也可以使用initWithContentsOfURL直接下载文件,但是有一个原因不这么做:
    1386     // It's also possible to have NSXMLParser download the data, by passing it a URL, but this is not desirable
    1387     // because it gives less control over the network, particularly in responding to connection errors.
    1388     [parser setDelegate:self];
    1389     [parser parse];
    1390 
    1391     2. 常用的委托方法
    1392     - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName
    1393                                 namespaceURI:(NSString *)namespaceURI
    1394                                 qualifiedName:(NSString *)qName
    1395                                 attributes:(NSDictionary *)attributeDict;
    1396     - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName
    1397                                 namespaceURI:(NSString *)namespaceURI
    1398                                 qualifiedName:(NSString *)qName;
    1399     - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string;
    1400     - (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError;
    1401 
    1402     static NSString *feedURLString = @"http://www.yifeiyang.net/test/test.xml";
    1403 
    1404     3.  应用举例
    1405     - (void)parseXMLFileAtURL:(NSURL *)URL parseError:(NSError **)error
    1406     {
    1407         NSXMLParser *parser = [[NSXMLParser alloc] initWithContentsOfURL:URL];
    1408         [parser setDelegate:self];
    1409         [parser setShouldProcessNamespaces:NO];
    1410         [parser setShouldReportNamespacePrefixes:NO];
    1411         [parser setShouldResolveExternalEntities:NO];
    1412         [parser parse];
    1413         NSError *parseError = [parser parserError];
    1414         if (parseError && error) {
    1415             *error = parseError;
    1416         }
    1417         [parser release];
    1418     }
    1419 
    1420     - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI
    1421                                         qualifiedName:(NSString*)qName attributes:(NSDictionary *)attributeDict{
    1422         // 元素开始句柄
    1423         if (qName) {
    1424             elementName = qName;
    1425         }
    1426         if ([elementName isEqualToString:@"user"]) {
    1427             // 输出属性值
    1428             NSLog(@"Name is %@ , Age is %@", [attributeDict objectForKey:@"name"], [attributeDict objectForKey:@"age"]);
    1429         }
    1430     }
    1431 
    1432     - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI
    1433                                         qualifiedName:(NSString *)qName
    1434     {
    1435         // 元素终了句柄
    1436         if (qName) {
    1437                elementName = qName;
    1438         }
    1439     }
    1440 
    1441     - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
    1442     {
    1443         // 取得元素的text
    1444     }
    1445 
    1446     NSError *parseError = nil;
    1447     [self parseXMLFileAtURL:[NSURL URLWithString:feedURLString] parseError:&parseError];
    1448 
    1449 如何隐藏状态栏 
    1450 [ UIApplication sharedApplication ].statusBarHidden = YES;
    1451 
    1452 .m 文件与.mm文件的区别 
    1453 .m文件是object-c文件
    1454 .mm文件相当于c++或者c文件
    1455 
    1456 NSLog(@"afd")与 NSLog("afd")
    1457 
    1458 细微差别会导致程序崩溃。
    1459 
    1460 但是我不太明白为何苹果要把编译器做的对这两种常量有区别。
    1461 
    1462 不过值得一提的是可能为了方便苹果自身的NSObject对象的格式化输出。
    1463 
    1464 safari其实没有把内存的缓存写到存储卡上 
    1465 
    1466 NSURLCache doesn't seem to support writing to disk on iPhone. The documentation for NSCachedURLResponse says that the NSURLCacheStoragePolicy "NSURLCacheStorageAllowed" is treated as "NSURLCacheStorageAllowedInMemoryOnly" by iPhone OS. 
    1467 
    1468 官方文档是这么说的。
    1469 
    1470 为了证明这个,我找到了一个目录。
    1471 
    1472 /private/var/mobile/Library/Caches/Safari/Thumbnails
    1473 
    1474 随机数的使用
    1475 
    1476         头文件的引用
    1477         #import <time.h>
    1478         #import <mach/mach_time.h>
    1479 
    1480         srandom()的使用
    1481         srandom((unsigned)(mach_absolute_time() & 0xFFFFFFFF));
    1482 
    1483         直接使用 random() 来调用随机数
    1484 
    1485 在UIImageView 中旋转图像
    1486 
    1487         float rotateAngle = M_PI;
    1488         CGAffineTransform transform =CGAffineTransformMakeRotation(rotateAngle);
    1489         imageView.transform = transform;
    1490        
    1491         以上代码旋转imageView, 角度为rotateAngle, 方向可以自己测试哦!
    1492 
    1493 
    1494 在Quartz中如何设置旋转点
    1495 
    1496         UIImageView *imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"bg.png"]];
    1497         imageView.layer.anchorPoint = CGPointMake(0.5, 1.0);
    1498 
    1499         这个是把旋转点设置为底部中间。记住是在QuartzCore.framework中才得到支持。
    1500 
    1501 创建.plist文件并存储
    1502 
    1503         NSString *errorDesc;  //用来存放错误信息
    1504         NSMutableDictionary *rootObj = [NSMutableDictionary dictionaryWithCapacity:4]; //NSDictionary, NSData等文件可以直接转化为plist文件
    1505         NSDictionary *innerDict;
    1506         NSString *name;
    1507         Player *player;
    1508         NSInteger saveIndex;
    1509     
    1510         for(int i = 0; i < [playerArray count]; i++) {
    1511               player = nil;
    1512               player = [playerArray objectAtIndex:i];
    1513               if(player == nil)
    1514                      break; 
    1515               name = player.playerName;// This "Player1" denotes the player name could also be the computer name
    1516               innerDict = [self getAllNodeInfoToDictionary:player];
    1517               [rootObj setObject:innerDict forKey:name]; // This "Player1" denotes the person who start this game
    1518         }
    1519         player = nil;
    1520         NSData *plistData = [NSPropertyListSerialization dataFromPropertyList:(id)rootObj format:NSPropertyListXMLFormat_v1_0 errorDescription:&errorDesc];
    1521 
    1522         红色部分可以忽略,只是给rootObj添加一点内容。这个plistData为创建好的plist文件,用其writeToFile方法就可以写成文件。下面是代码:
    1523         
    1524         /*得到移动设备上的文件存放位置*/
    1525         NSString *documentsPath = [self getDocumentsDirectory]; 
    1526         NSString *savePath = [documentsPath stringByAppendingPathComponent:@"save.plist"];
    1527     
    1528         /*存文件*/
    1529         if (plistData) {
    1530                 [plistData writeToFile:savePath atomically:YES];
    1531          }
    1532          else {
    1533                 NSLog(errorDesc);
    1534                 [errorDesc release];
    1535         }
    1536 
    1537         - (NSString *)getDocumentsDirectory {  
    1538                 NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);  
    1539                 return [paths objectAtIndex:0];  
    1540         } 
    1541 
    1542 读取plist文件并转化为NSDictionary
    1543 
    1544         NSString *documentsPath = [self getDocumentsDirectory];
    1545         NSString *fullPath = [documentsPath stringByAppendingPathComponent:@"save.plist"];
    1546         NSMutableDictionary* plistDict = [[NSMutableDictionary alloc] initWithContentsOfFile:fullPath];
    1547 
    1548 读取一般性文档文件
    1549 
    1550         NSString *tmp;
    1551         NSArray *lines; /*将文件转化为一行一行的*/
    1552         lines = [[NSString    stringWithContentsOfFile:@"testFileReadLines.txt"] 
    1553                        componentsSeparatedByString:@"\n"];
    1554     
    1555          NSEnumerator *nse = [lines objectEnumerator];
    1556     
    1557          // 读取<>里的内容
    1558          while(tmp = [nse nextObject]) {
    1559                   NSString *stringBetweenBrackets = nil;
    1560                   NSScanner *scanner = [NSScanner scannerWithString:tmp];
    1561                   [scanner scanUpToString:@"<" intoString:nil];
    1562                   [scanner scanString:@"<" intoString:nil];
    1563                   [scanner scanUpToString:@">" intoString:&stringBetweenBrackets];
    1564 
    1565                   NSLog([stringBetweenBrackets description]);
    1566           }
    1567 
    1568 对于读写文件,还有补充,暂时到此。随机数和文件读写在游戏开发中经常用到。所以把部分内容放在这,以便和大家分享,也当记录,便于查找。
    1569 
    1570 隐藏NavigationBar
    1571 [self.navigationController setNavigationBarHidden:YES animated:YES];
    1572 
    1573 在想隐藏的ViewController中使用就可以了。
    1574 
    1575 如何在iPhone程序中调用外部命令 
    1576  
    1577 下面是如何在iPhone非官方SDK程序中调用外部命令的方法。 
    1578 
    1579 - ( NSString * ) executeCommand : ( NSString * ) cmd { NSString * output = [ NSString string ] ; FILE * pipe = popen ( [ cmd cStringUsingEncoding : NSASCIIStringEnc
    1580    
    1581 下面是如何在iPhone非官方SDK程序中调用外部命令的方法。
    1582 
    1583 - (NSString *)executeCommand: (NSString *)cmd
    1584 {
    1585     NSString *output = [NSString string];
    1586     FILE *pipe = popen([cmd cStringUsingEncoding: NSASCIIStringEncoding], "r");
    1587     if (!pipe) return;
    1588  
    1589     char buf[1024];
    1590     while(fgets(buf, 1024, pipe)) {
    1591     output = [output stringByAppendingFormat: @"%s", buf];
    1592 }
    1593  
    1594 pclose(pipe);
    1595 return output;
    1596 }
    1597  
    1598 NSString *yourcmd = [NSString stringWithFormat: @"your command"];
    1599 [self executeCommand: yourcmd];
    1600 
    1601 如何在iPhone程序读取数据时显示进度窗
    1602  
    1603 下面代码说明如何使用iPhone 非官方SDK在读取数据时显示进度条。
    1604 
    1605 以下代码参考了MobileRss。
    1606 
    1607 定义头文件:
    1608 
    1609 #import "uikit/UIProgressHUD.h"
    1610  
    1611 @interface EyeCandy : UIApplication {
    1612  UIProgressHUD *progress;
    1613 }
    1614  
    1615 - (void) showProgressHUD:(NSString *)label withWindow:(UIWindow *)w withView:(UIView *)v withRect:(struct CGRect)rect;
    1616 - (void) hideProgressHUD;
    1617  
    1618 .@end
    1619 
    1620 上面的引号要改成<>1621 
    1622 import "EyeCandy.h"
    1623  
    1624 @implementation EyeCandy
    1625 - (void)showProgressHUD:(NSString *)label withWindow:(UIWindow *)w withView:(UIView *)v withRect:(struct CGRect)rect
    1626 {
    1627  progress = [[UIProgressHUD alloc] initWithWindow: w];
    1628  [progress setText: label];
    1629  [progress drawRect: rect];
    1630  [progress show: YES];
    1631  
    1632  [v addSubview:progress];
    1633 }
    1634  
    1635 - (void)hideProgressHUD
    1636 {
    1637  [progress show: NO];
    1638  [progress removeFromSuperview];
    1639 }
    1640  
    1641 @end
    1642 
    1643 使用下面代码调用:
    1644 
    1645 // Setup Eye Candy View
    1646 _eyeCandy = [[[EyeCandy alloc] init] retain];
    1647  
    1648 // Call loading display
    1649 [_eyeCandy showProgressHUD:@"Loading …" withWindow:window withView:mainView withRect:CGRectMake(0.0f, 100.0f, 320.0f, 50.0f)];
    1650  
    1651 // When finished for hiding the &quot;loading text&quot;
    1652 [_eyeCandy hideProgressHUD];
    1653 
    1654 WebKit的基本用法 
    1655 
    1656 WebKit是苹果开发中比较常用的浏览器引擎,Safari使用的正是WebKit引擎。WebKit基于KDE的KHTML加以再开发,解析速度超过了以往所有的浏览器。这里简单记录一下WebKit的基本用法。
    1657 
    1658 WebKit由下面的结构组成:
    1659 
    1660 •DomCore 
    1661 •JavaScriptCore 
    1662 •WebCore 
    1663 一般浏览
    1664 
    1665 要打开网页,可以这样做:
    1666 
    1667 1.[[webView mainFrame] loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:urlText]]];
    1668 DomCore
    1669 
    1670 DomCore用于处理DOM文档,包括:
    1671 
    1672 •DOMDocument 
    1673 •DOMNamedNodeMap 
    1674 •DOMNode 
    1675 •DOMNodeList 
    1676 要获取一个DOMDocument,可以这样做:
    1677 
    1678 1.DOMDocument *myDOMDocument = [[webView mainFrame] DOMDocument];
    1679 要用于HTML处理,可以使用DOMHTMLDocument(Mac OS X 10.4之后),获取方式相同:
    1680 
    1681 1.DOMHTMLDocument *myDOMDocument = (DOMHTMLDocument*)[[webView mainFrame] DOMDocument];
    1682 方法定义:
    1683 
    1684 苹果的WebKit更新说明
    1685 
    1686 JavaScriptCore
    1687 
    1688 在WebKit中执行脚本的方法:
    1689 
    1690 1.WebScriptObject *myscript = [webView windowScriptObject];
    1691 2.NSString *script = @"alert('hello');";
    1692 3.[myscript evaluateWebScript script];
    1693 参考:
    1694 
    1695 http://www.macgood.com/thread-24636-1-1.html
    1696 
    1697 http://www.cocoadev.com/index.pl?WebKit
    1698 
    1699 为什么不要做iPhone上面的应用
    1700 
    1701 简单来说就是因为两国的文化不同,或者说生活方式的不同。美国不管多穷的人都有车,他们平时的生活方式和国内绝对是完全不同的。做应用和做游戏不一样,应用需要满足人们某一
    1702   简单来说就是因为两国的文化不同,或者说生活方式的不同。美国不管多穷的人都有车,他们平时的生活方式和国内绝对是完全不同的。做应用和做游戏不一样,应用需要满足人们某一部分的需求,比如,一个计算小费的软件,在国内不会有市场,可是美国人都有一个。
    1703 大家可以设身处地的想一下,谁会需要你做的软件,这样的人有多少,这样的人又有iPhone的又有多少。
    1704 
    1705 对于应用来说,针对商务人士的又比针对普通人的好,基本上商务人士不太在乎几块钱一个软件,这也是backup assistant卖得最好的一个原因。这个软件一年的年费24美元,大约有数千万美元一年的收入。什么样的应用软件是这些人需要的?连笔者自己也不太清楚,笔者虽然已经在美国工作了多年,但是对于美国文化的了解还处于一知半解状态,更不用说正在留学的学生了。
    1706 
    1707 还有一个能成功的应用软件是你已经有非常多的数据,比如你有当地的所有加油站的信息,做一个油价的地图软件,显然市场会不错。不过数据要是美国的数据,国内的没有太大的帮助。
    1708 
    1709 综上所述,游戏比应用好做很多,如果要作应用的话,可以从单机的小应用开始。要在美国运营一个支持10万人的网络应用,没有30万美元绝对没戏。如果非要上,只能早死早超生了。
    1710 
    1711 获取iPhone用户手机号
    1712 
    1713 使用下面的函数可以返回用户的手机号:
    1714 
    1715 extern NSString *CTSettingCopyMyPhoneNumber();
    1716 
    1717 然后调用即可。
    1718 
    1719 由于这个函数是包含在CoreTelephony中,所以只能用于非官方iPhone SDK。
    1720 
    1721 在程序中关闭iPhone
    1722 首先在程序中引用 #include sys/reboot.h 然后使用 reboot(RB_HALT); 就可以直接将iPhone关机。
    1723    
    1724 首先在程序中引用
    1725 
    1726 #include <sys/reboot.h>
    1727 
    1728 然后使用
    1729 
    1730 reboot(RB_HALT);
    1731 
    1732 就可以直接将iPhone关机。
    1733 
    1734 convert the contents of an NSData object to an NSString
    1735 
    1736 1. NSString *stringFromASC = [NSString stringWithCString:[ascData bytes] length:[ascData length]];
    1737 
    1738 If the NSData object contains unichar characters then do this:
    1739 
    1740 NSString *stringFromUnichar = [NSString stringWithCharacters:[unicharData bytes] length:[unicharData length] / sizeof(unichar)];
    1741 
    1742 2. - (id)initWithData:(NSData *)data encoding:(NSStringEncoding)encoding
    1743 
    1744 iPhone的特殊URL
    1745 在iPhone中,可以直接用UIApp打开URL地址。如下所示:
    1746 
    1747 1.[ UIApp openURL: [ NSURL URLWithString:@"http://www.apple.com" ] ];
    1748 或者:
    1749 
    1750 1.[ UIApp openURL: [ NSURL URLWithString:@"mailto:apple@mac.com?Subject=hello" ] ];
    1751 与此同时,iPhone还包含一些其他除了http://或者mailto:之外的URL: 
    1752 
    1753 sms:// 可以调用短信程序
    1754 
    1755 tel:// 可以拨打电话
    1756 
    1757 itms:// 可以打开MobileStore.app
    1758 
    1759 audio-player-event:// 可以打开iPod
    1760 
    1761 audio-player-event://?uicmd=show-purchased-playlist 可以打开iPod播放列表
    1762 
    1763 video-player-event:// 可以打开iPod中的视频
    1764 
    1765 
    1766 get iphone uniqueIdentifier
    1767 
    1768 I also find that I can get uniqueIdentifier using:
    1769 
    1770 UIDevice *myDevice = [UIDevice currentDevice];NSString *identifier = myDevice.uniqueIdentifier;
    1771 
    1772 
    1773 打开本地网页,与远程网页
    1774 
    1775 fileURLWithPath:Initializes and returns a newly created NSURL object as a file URL with a specified path.
    1776 
    1777 + (id)fileURLWithPath:(NSString *)path
    1778 
    1779 URLWithString:
    1780 Creates and returns an NSURL object initialized with a provided string.
    1781 
    1782 + (id)URLWithString:(NSString *)URLString
    1783 
    1784 教你如何使用UIWebView
    1785 
    1786 Start by opening up the WebBrowserTutorialAppDelegate.h file and editing the @interface line to read:
    1787 
    1788 @interface WebBrowserTutorialAppDelegate : NSObject <UIWebViewDelegate> {
    1789 What we have done is to make the main AppDelegate a delegate for the UIWebView as well.
    1790 
    1791 Now we need to set our webView to have the main AppDelegate as its delegate, you can do this by opening up WebBrowserTutorialAppDelegate.m and putting the following line just inside theapplicationDidFinishLaunching function:
    1792 
    1793 webView.delegate = self;
    1794 That is all pretty self explanatory, it just sets the delegate of our webView to self, which in this case is our main application delegate.
    1795 
    1796 Now we are pretty much done, we just need to add the function to catch the link clicks. To do this we need to add a new function, copy the content below to the WebBrowserTutorialAppDelegate.m file:
    1797 
    1798 - (BOOL)webView:(UIWebView*)webView shouldStartLoadWithRequest:(NSURLRequest*)request navigationType:(UIWebViewNavigationType)navigationType {
    1799     NSURL *url = request.URL;
    1800     NSString *urlString = url.absoluteString;
    1801     NSLog(urlString);
    1802     return YES;
    1803 }
    1804 This function will catch all requests and allow you to either manipulate them and pass them on or to perform your own custom action and stop the event from bubbling.
    1805 
    1806 The first line gets the URL of the request, this is the contents inside the href attribute in the anchor tag.
    1807 The next line converts the URL to a string so we can log it out. You can access many parts of the NSURL, here are some of them and brief description of what they do.
    1808 
    1809 * absoluteString - An absolute string for the URL. Creating by resolving the receiver’s string against its base.
    1810 * absoluteURL - An absolute URL that refers to the same resource as the receiver. If the receiver is already absolute, returns self.
    1811 * baseURL - The base URL of the receiver. If the receiver is an absolute URL, returns nil.
    1812 * host - The host of the URL.
    1813 * parameterString - The parameter string of the URL.
    1814 * password - The password of the URL (i.e. http://user:pass@www.test.com would return pass)
    1815 * path - Returns the path of a URL.
    1816 * port - The port number of the URL.
    1817 * query - The query string of the URL.
    1818 * relativePath - The relative path of the URL without resolving against the base URL. If the receiver is an absolute URL, this method returns the same value as path.
    1819 * relativeString - string representation of the relative portion of the URL. If the receiver is an absolute URL this method returns the same value as absoluteString.
    1820 * scheme - The resource specifier of the URL (i.e. http, https, file, ftp, etc).
    1821 * user - The user portion of the URL.
    1822 
    1823 Then the third line simply logs the URL to the console, so you will new to open up the console while you run this in the simulator to see the results.
    1824 
    1825 Finally the forth line returns YES, this will allow the UIWebView to follow the link, if you would just like to catch a link and stop the UIWebView from following it then simply return NO.
    1826 
    1827 UIBUtton title image 不能同时显示
    1828 
    1829 [ leftbutton setTitle:_(@"About") forState:UIControlStateNormal ];
    1830 
    1831 
    1832 [ leftbutton setImage:image forState:UIControlStateNormal ];
    1833 
    1834 不能同时显示。
    1835 
    1836 其他控件如:UINavigatonItem
    1837 
    1838 不要在语言包里面设置空格
    1839 有时,为了界面的需要,我们不要在语言包里面加空格,要在程序中进行控制。
    1840 buttonTitle = [ NSString stringWithFormat:@"        %@", _(@"updateWeb") ];
    1841 
    1842 NSNotificationCenter 带参数发送
    1843 
    1844 MPMoviePlayerController* theMovie = [[MPMoviePlayerController alloc]initWithContentURL:[NSURL fileURLWithPath:[[[tableTitles objectForKey:keyIndex] objectAtIndex:row] objectAtIndex:3] ]];
    1845 
    1846 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(myMovieFinishedCallback:) name:MPMoviePlayerPlaybackDidFinishNotification object:theMovie];
    1847 
    1848 [theMovie play];
    1849 
    1850 -(void)myMovieFinishedCallback:(NSNotification*)aNotification
    1851 
    1852 {
    1853 
    1854      MPMoviePlayerController *theMovie = [aNotification object];
    1855 
    1856    [[NSNotificationCenter defaultCenter] removeObserver:self           name:MPMoviePlayerPlaybackDidFinishNotification object:theMovie];
    1857 
    1858    // Release the movie instance [theMovie release];
    1859 
    1860 }
    1861 
    1862 ------------
    1863 
    1864 MPMoviePlayerController* theMovie = [[MPMoviePlayerController alloc]initWithContentURL:[NSURL fileURLWithPath:[[[tableTitles objectForKey:keyIndex] objectAtIndex:row] objectAtIndex:3] ]];
    1865 
    1866 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(myMovieFinishedCallback:) name:MPMoviePlayerPlaybackDidFinishNotification object:theMovie userInfo:dic];
    1867 
    1868 [theMovie play];
    1869 
    1870 -(void)myMovieFinishedCallback:(NSNotification*)aNotification
    1871 
    1872 {
    1873 
    1874 MPMoviePlayerController *theMovie = [aNotification object];
    1875 
    1876 [[NSNotificationCenter defaultCenter] removeObserver:self name:MPMoviePlayerPlaybackDidFinishNotification object:theMovie];
    1877 
    1878 // Release the movie instance [theMovie release];
    1879 
    1880 }
    1881 
    1882 延时一段时间执行某一函数
    1883 
    1884 [self performSelector:@selector(dismissModal) withObject:self afterDelay:1.0];
    1885 
    1886 无99美金证书联机开发
    1887 第一步:进入 cd /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS4.1.sdk/ sudo vi SDKSettings.plist,将CODE_SIGNING_REQUIRED的值改成NO. 保存后退出.
    1888 
    1889 第二步:重新启动XCode项目.
    1890 
    1891 第三步:右击项目GetInfo.将Code Signing下的Code Signing Identity值设置成Don't Code Sign, 将Code Signing Identity下的Any iOS Device的值设置成空.
    1892 
    1893 获取IOS设备的基本信息
    1894 系统唯一标识 
    1895 是什么设备:iPad还是iPhone等 
    1896 iOS版本号 
    1897 系统名称 
    1898 
    1899 [[UIDevice currentDevice] uniqueIdentifier], 
    1900                        [[UIDevice currentDevice] localizedModel], 
    1901                        [[UIDevice currentDevice] systemVersion], 
    1902                        [[UIDevice currentDevice] systemName], 
    1903                        [[UIDevice currentDevice] model]];
    1904 
    1905 用NSDateFormatter调整时间格式的代码
    1906 
    1907 在开发iOS程序时,有时候需要将时间格式调整成自己希望的格式,这个时候我们可以用NSDateFormatter类来处理。
    1908 例如:
    1909 
    1910 //实例化一个NSDateFormatter对象
    1911 
    1912 NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    1913 
    1914 //设定时间格式,这里可以设置成自己需要的格式
    1915 
    1916 [dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
    1917 
    1918 //用[NSDate date]可以获取系统当前时间
    1919 
    1920 NSString *currentDateStr = [dateFormatter stringFromDate:[NSDate date]];
    1921 
    1922 //输出格式为:2010-10-27 10:22:13
    1923 
    1924 NSLog(@”%@”,currentDateStr);
    1925 
    1926 //alloc后对不使用的对象别忘了release
    1927 
    1928 [dateFormatter release];
    1929 
    1930 UIView设置成圆角方法
    1931 
    1932 m_mainImgView.layer.cornerRadius = 6;
    1933 m_mainImgView.layer.masksToBounds = YES;
    1934 
    1935 iPhone里的frame和bounds区别
    1936 
    1937  
    1938 
    1939 Objective-C内存管理
    1940 
    1941 在使用Objective-C的工作中内存管理是首先要学会的一项技能,是如此重要,就好比是男人就要追漂亮姑娘一样~~下面就来聊聊Apple官网上的内存管理的事情。
    1942 
    1943 Objective-C的对象内存管理是一件非常有意思的事情,由其是在iPhone嵌入式设备中.
    1944 
    1945 想玩的省心点,就得熟知它的管理规则,由其是内存的管理机制。了解它的品性了才能在Cocoa的世界里如鱼得水。否则,反之(如水得鱼!!^_^)。
    1946 
    1947 首先,要牢记Apple的官网上的内存管理三定律:
    1948 
    1949 1,一个对象可以有一个或多个拥有者
    1950 
    1951 2,当它一个拥有都都没有时,它就会被回收
    1952 
    1953 3,如果想保留一个对象不被回收,你就必需成为它的拥有者
    1954 
    1955 
    1956 所有内存管理的原则全在这里!!
    1957 
    1958 简单??哈哈!
    1959 
    1960 名人曰:“大道至简”
    1961 
    1962 这儿玩意儿说起来比过家家还容易,但其实有些事情真正做起来并不是简单的事儿~~
    1963 
    1964 咱们首先来说怎么样才能成为一个对象的拥有者。Cocoa提供了一个机制叫"reference counting",翻译过来就是“关联记数器”(自己翻译的,真不知叫啥,如果有官方的翻译请通知我)。每一个对象都有一个关联记数的值。当它被创建时,它的值为“1”。当值减少到“0”时,就会被回收(调用它的deallocate方法,如果没有写,则调用从NSObject继承而来的回收方法,下文有说,一定要重写该方法)。以下几个方法可以操作这个记数:
    1965 
    1966 1,alloc
    1967    为对象分配内存,记数设为“1”,并返回此对象。
    1968 
    1969 2,copy
    1970    复制一个对象,此对象记数为“1”,返回此对象。你将成为此克隆对象的拥有者
    1971 
    1972 3,retain
    1973    对象“关联记数”加“1”,并成为此对象的拥有者。
    1974 
    1975 4,release
    1976    对象“关联记数”减“1”,并丢掉此对象。
    1977 
    1978 5,autorelease
    1979 
    1980    在未来的某一时刻,对象“关联记数”减“1”。并在未来的某个时间放弃此对象。
    1981 
    1982 有了上面的几个方法(当然这也是所有的内存操作的方法,简单吧,哈哈哈)你就可以随意操作一个对象的记数。并部分或完全的控制它的生命周期。但实际应用中,随意乱写上面的任何一个方法都可能会带来严重的内存泄露。混乱的内存分配等于没完没了的麻烦工作,你不想在情人节的日子还在为记数之类的鸟问题而丢了老婆吧~~哈哈哈,为了美丽温柔贤惠又善解人意的准老婆请牢记以下四条:
    1983 
    1984 1,一个代码块内要确保copy, alloc 和 retain 的使用数量与 release 和 autorelease 的数量。
    1985 
    1986 2,在使用以“alloc”或“new”开头或包含“copy”的方法,或“retain”一个对象时,你就会变为它的拥有者。
    1987 
    1988 3,实现“dealloc”方法,并施放所有的实例变量。(其实这里还有很多的巧儿门!!)
    1989 
    1990 4,永不自己调用“dealloc”方法,这是系统当“retain”减到“0”时,自动调用的。手动调用会引起retain count记数错误(多一次的release)。
    1991 
    1992 其实做到这些也不难,
    1993 
    1994 retain count 增加与减少的方法对应,板丁板做到了就行了。
    1995 
    1996 来自:http://blog.csdn.net/dboylx/archive/2009/02/13/3888746.aspx
    1997 
    1998 iphone更改键盘右下角按键的type
    1999 
    2000 以UISearchBar为例。
    2001 
    2002 
    2003 创建mySearchBar:
    2004 
    2005 mySearchBar = [[UISearchBar alloc] initWithFrame:CGRectMake(0.0, 0,320, SEARCH_HEIGHT)];
    2006 mySearchBar.placeholder = curPath;
    2007 [mySearchBar setDelegate:self];
    2008 //tableView.tableHeaderView =mySearchBar;
    2009 [self.view addSubview:mySearchBar];
    2010 
    2011 
    2012 更改按键的keyType(默认是return,这里将它更改成done,当然还可以更改成其他的):
    2013 UITextField *searchField = [[mySearchBar subviews] lastObject];
    2014 [searchField setReturnKeyType:UIReturnKeyDone];
    2015 [mySearchBar release];
    展开全文
  • iOS 开发笔记

    2015-11-13 14:05:43
    一、数据库 SQLite数据库框架之FMDB(六阿哥) http://blog.6ag.cn/1231.html


    一、数据库

    SQLite数据库框架之FMDB(六阿哥)   http://blog.6ag.cn/1231.html


    展开全文
  • ios开发笔记

    2014-09-29 17:39:24
    1,要修改某个文件的隐藏属性则使用方法: chflags nohidden filename 再次隐藏: chflags hidden filename
    1,要修改某个文件的隐藏属性则使用方法:
    
    chflags nohidden filename
    再次隐藏:
    chflags hidden filename
    展开全文
  • iOS开发笔记

    千次阅读 2016-08-22 17:10:44
    在ViewController之间交换数据,生成iOS应用程序图标,字符串操作

    如何在两个ViewController之间交换数据

    简单来讲,把数据传过去要用property,把数据传回来要用delegate或block(closure)
    Passing Data between View Controllers

    生成iOS应用程序图标

    自动生成iOS以及Android应用程序图标的网站
    App Icon Resizer

    字符串操作

    Swift: How to get substring from start to last index of character

    AQDefaultDevice (173): skipping input stream 0 0 0x0

    去除多余Debug信息的方法
    Product > Scheme > Edit Scheme... > Run > Arguments > Environment Variables
    Name:OS_ACTIVITY_MODE, Value: disable

    Strange AQDefaultDevice logging
    Xcode 8 Console Garbage?

    展开全文
  • IOS 开发笔记

    2013-11-19 13:08:11
    IOS 开发笔记

空空如也

1 2 3 4 5 ... 20
收藏数 5,892
精华内容 2,356
关键字:

ios开发笔记