iphone小小小結

tags:    時間:2014-04-18 23:50:14
iphone小小總結

iphone開發筆記

 

退回輸入鍵盤

  - (BOOL) textFieldShouldReturn:(id)textField{

    [textField  resignFirstResponder];

}

 

CGRect

CGRect frame = CGRectMake (origin.x, origin.y, size.width, size.height);矩形

NSStringFromCGRect(someCG) CGRect結構轉變為格式化字元串;

CGRectFromString(aString) 由字元串恢復出矩形;

CGRectInset(aRect) 創建較小或較大的矩形(中心點相同),+較小  -較大

CGRectIntersectsRect(rect1, rect2) 判斷兩矩形是否交叉,是否重疊

CGRectZero 高度和寬度為零的/位於(00)的矩形常量

 

CGPoint & CGSize

CGPoint aPoint = CGPointMake(x, y);   

CGSize aSize = CGSizeMake(width, height);

 

設置透明度

[myView setAlpha:value];   (0.0 < value < 1.0)

 

設置背景色

[myView setBackgroundColor:[UIColor redColor]]; 

 (blackColor;darkGrayColor;lightGrayColor;

whiteColor;grayColor; redColor; greenColor;

blueColor; cyanColor;yellowColor;

magentaColor;orangeColor;purpleColor;

brownColor; clearColor; )

 

自定義顏色

UIColor *newColor = [[UIColor alloc]

 initWithRed:(float) green:(float) blue:(float) alpha:(float)]; 

     0.0~1.0

 

豎屏

320X480

 

橫屏

480X320   

 

狀態欄高 (顯示時間和網路狀態)

20 像素  

 

導航欄、工具欄高(返回)

44像素

 

隱藏狀態欄

[[UIApplication shareApplication] setStatusBarHidden: YES animated:NO]

 

橫屏

[[UIApplication shareApplication]

setStatusBarOrientation:UIInterfaceOrientationLandscapeRight].

 

屏幕變動檢測

orientation == UIInterfaceOrientationLandscapeLeft

 

全屏

window=[[UIWindow alloc] initWithFrame:[UIScreen mainScreen] bounds];

 

自動適應父視圖大小:

aView.autoresizingSubviews = YES;

aView.autoresizingMask = (UIViewAutoresizingFlexibleWidth |

                                      UIViewAutoresizingFlexibleHeight);

 

 定義按鈕

UIButton *scaleUpButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];

[scaleUpButton setTitle:@"放 大" forState:UIControlStateNormal];

scaleUpButton.frame = CGRectMake(40, 420, 100, 40);

[scaleUpButton addTarget:self

 action:@selector(scaleUp)

forControlEvents:UIControlEventTouchUpInside];

 

設置視圖背景圖片

UIImageView *aView;

[aView setImage:[UIImage imageNamed:@」name.png」]];

view1.backgroundColor = [UIColor colorWithPatternImage:

[UIImage imageNamed:@"image1.png"]];

 

自定義UISlider的樣式和滑塊

 

我們使用的是UISlidersetMinimumTrackImage,和setMaximumTrackImage方法來定義圖片的,這兩個方法可以設置滑塊左邊和右邊的圖片的,不過如果用的是同一張圖片且寬度和控制項寬度基本一致,就不會有變形拉伸的後果,先看代碼,寫在 viewDidLoad中:

    //左右軌的圖片

    UIImage *stetchLeftTrack= [UIImage imageNamed:@"brightness_bar.png"];

    UIImage *stetchRightTrack = [UIImage imageNamed:@"brightness_bar.png"];

    //滑塊圖片

    UIImage *thumbImage = [UIImage imageNamed:@"mark.png"];

   

    UISlider *sliderA=[[UISlider alloc]initWithFrame:CGRectMake(30, 320, 257, 7)];

    sliderA.backgroundColor = [UIColor clearColor];

    sliderA.value=1.0;

    sliderA.minimumValue=0.7;

    sliderA.maximumValue=1.0;

   

    [sliderA setMinimumTrackImage:stetchLeftTrack forState:UIControlStateNormal];

    [sliderA setMaximumTrackImage:stetchRightTrack forState:UIControlStateNormal];

    //注意這裡要加UIControlStateHightlighted的狀態,否則當拖動滑塊時滑塊將變成原生的控制項

    [sliderA setThumbImage:thumbImage forState:UIControlStateHighlighted];

    [sliderA setThumbImage:thumbImage forState:UIControlStateNormal];

    //滑塊拖動時的事件

    [sliderA addTarget:self action:@selector(sliderValueChanged:) forControlEvents:UIControlEventValueChanged];

    //滑動拖動后的事件

    [sliderA addTarget:self action:@selector(sliderDragUp:) forControlEvents:UIControlEventTouchUpInside];

   

    [self.view addSubview:sliderA];

 

為了大家實驗方便,我附上背景圖brightness_bar.png和滑塊圖mark.png

http://pic002.cnblogs.com/images/2011/162291/2011121611431816.png

http://pic002.cnblogs.com/images/2011/162291/2011121611432897.png

 

 -(IBAction)sliderValueChanged:(id)sender{

UISlider *slider = (UISlider *) sender;

NSString *newText = [[NSString alloc] initWithFormat:@」%d」, (int)(slider.value + 0.5f)];

label.text = newText;

}

 

活動表單

<UIActionSheetDelegate>

 

 - (IBActive) someButtonPressed:(id) sender

{

    UIActionSheet *actionSheet = [[UIActionSheet alloc] 

                    initWithTitle:@」Are you sure?」

                    delegate:self

                    cancelButtonTitle:@」No way!」

                    destructiveButtonTitle:@」Yes, I』m Sure!」

                    otherButtonTitles:nil];

    [actionSheet showInView:self.view];

    [actionSheet release];

}

 

警告視圖 

 <UIAlertViewDelegate>

 

 - (void) actionSheet:(UIActionSheet *)actionSheet didDismissWithButtonIndex:(NSInteger) buttonIndex

{

     if(buttonIndex != [actionSheet cancelButtonIndex])

     {

          NSString *message = [[NSString alloc] initWithFormat:@」You can          

                   breathe easy, everything went OK.」];

          UIAlertView *alert = [[UIAlertView alloc]    

                               initWithTitle:@」Something was done」

                                message:message

                                delegate:self

                                cancelButtonTitle:@」OK」

                                otherButtonTitles:nil];

          [alert show];

          [alert release];

          [message release];

     }

}

 

動畫效果

-(void)doChange:(id)sender

{

if(view2 == nil)

{

[self loadSec];

}

[UIView beginAnimations:nil context:NULL];

[UIView setAnimationDuration:1];        

[UIView setAnimationTransition:([view1 superview]?UIViewAnimationTransitionFlipFromLeft:UIViewAnimationTransitionFlipFromRight)forView:self.view cache:YES];

   

    if([view1 superview]!= nil)

{

[view1 removeFromSuperview];

[self.view addSubview:view2];

 

}else {

 

[view2 removeFromSuperview];

[self.view addSubview:view1];

}

[UIView commitAnimations];

}

 

Table View   <UITableViewDateSource>

#pragma mark -

#pragma mark Table View Data Source Methods

//指定分區中的行數,默認為1

- (NSInteger)tableView:(UITableView *)tableView 

 numberOfRowsInSection:(NSInteger)section

{

return [self.listData count];

}

 

//設置每一行cell顯示的內容

- (UITableViewCell *)tableView:(UITableView *)tableView 

cellForRowAtIndexPath:(NSIndexPath *)indexPath

{

static NSString *SimpleTableIndentifier = @"SimpleTableIndentifier";

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:SimpleTableIndentifier];

if (cell == nil) {

cell = [[[UITableViewCell alloc] 

initWithStyle:UITableViewCellStyleSubtitle 

reuseIdentifier:SimpleTableIndentifier] 

autorelease];

}

     UIImage *image = [UIImage imageNamed:@"13.gif"];

cell.imageView.image = image;

     

NSUInteger row = [indexPath row];

cell.textLabel.text = [listData objectAtIndex:row];

     cell.textLabel.font = [UIFont boldSystemFontOfSize:20];

 

     if(row < 5)

cell.detailTextLabel.text = @"Best friends";

else 

    cell.detailTextLabel.text = @"friends";

return cell;

}

 

圖像、文本標籤和詳細文本標籤

 

圖像:如果設置圖像,則它顯示在文本的左側; 文本標籤:這是單元的主要文本(UITableViewCellStyleDefault 只顯示文本標籤);詳細文本標籤:這是單元的輔助文本,通常用作解釋性說明或標籤

 

UITableViewCellStyleSubtitle

UITableViewCellStyleDefault

UITableViewCellStyleValue1

UITableViewCellStyleValue2

 

<UITableViewDelegate>

#pragma mark -

#pragma mark Table View Delegate Methods

//把每一行縮進級別設置為其行號

- (NSInteger)tableView:(UITableView *)tableView indentationLevelForRowAtIndexPath:(NSIndexPath *)indexPath

{

NSUInteger row = [indexPath row];

return row;

}

//獲取傳遞過來的indexPath

- (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath

{

NSUInteger row = [indexPath row];

if (row == 0) 

return nil;

return indexPath;

}

 

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath

{

NSUInteger row = [indexPath row];

NSString *rowValue = [listData objectAtIndex:row];

NSString *message = [[NSString alloc] initWithFormat:@"You selected %@",rowValue];

UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Row Selected"

message:message

    delegate:nil

  cancelButtonTitle:@"Yes, I did!"

  otherButtonTitles:nil];

[alert show];

[alert release];

[message release];

[tableView deselectRowAtIndexPath:indexPath animated:YES];

}

 

//設置行的高度

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath

{

return 40;

}

 

NavigationController 推出push 推出pop

[self.navigationController pushViewController:_detailController animated:YES];

[self.navigationController popViewControllerAnimated:YES];

 

Debug:

NSLog(@"%s %d", __FUNCTION__, __LINE__);

 

點擊textField外的地方回收鍵盤

 

先定義一個UIControl類型的對象,在上面可以添加觸發事件,令SEL實踐為回收鍵盤的方法,最後將UIControl的實例加到當前View上。

UIControl *m_control = [[UIControl alloc] initWithFrame:CGRectMake(0, 0, 320, 480)];

[m_control addTarget:self action:@selector(keyboardReturn)

forControlEvents:UIControlEventTouchUpInside];

[self.view addSubview:m_control];

 

- (void) keyboardReturn

{

[aTextField resignFirstResponder];

}

 

鍵盤覆蓋輸入框

當鍵盤調出時將輸入框覆蓋時,可以用下方法:

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField

{

[self.view setFrame:CGRectMake(0, -100, 320, 480) ];

return YES;

}

- (BOOL)textFieldShouldEndEditing:(UITextField *)textField

{

  [self.view setFrame:CGRectMake(0, 0, 320, 480)];

           return YES;

}

當準備輸入時,將視圖的位置上調100,這樣鍵盤就不能覆蓋到輸入框。

 

當依賴注入方法不好使時,可以在AppDelegate內申明一個全局的控制器實例_anotherViewController,在另一個需要使用_anotherViewController的地方定義以下委託方法,使用共享的UIApplication實例來獲取該委託的引用

SomeAppDelegate *appDelegate = (SomeAppDelegate *)[[UIApplication sharedApplication] delegate];

_anotherViewController = appDelegate._anotherViewController;

 

UIViewController內建Table View

 

純代碼在UIViewController控制器內建Table View

@interface RootViewController : UIViewController <UITableViewDelegate, UITableViewDataSource> {

NSArray *timeZoneNames;

}

@property (nonatomic,retain) NSArray *timeZoneNames;

@end

 

(void) loadView

{

UITableView *tableView = [[UITableView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame]] style: UITableViewStylePlain];

tableView.autoresizingMask = (UIViewAutoresizingFlexibleHeight | UIViewAutoresizingWidth);

tableView.delegate = self;

tableView.dataSource = self;

[tableView reloadData];

 

self.view = tableView;

[tableView release];

}

 

 

將plist文件中的數據賦給數組

NSString *thePath = [[NSBundle mainBundle] pathForResource:@"States" ofType:@"plist"];

NSArray *array = [NSArray arrayWithContentsOfFile:thePath];

 

UITouch

手指的觸摸範圍:64X64

 

#pragma mark -

#pragma mark Touch Events

 

- (void)touchesBegan:(NSSet *) touches withEvent:(UIEvent *) event {

originFrame = bookCover.frame;

NSLog(@"%s %d", __FUNCTION__,__LINE__);

 

if ([touches count] == 2)

{

NSArray *twoTouches = [touches allObjects];

UITouch *firstTouch = [twoTouches objectAtIndex:0];

UITouch *secondTouch = [twoTouches objectAtIndex:1];

CGPoint firstPoint = [firstTouch locationInView:bookCover];

CGPoint secondPoint = [secondTouch locationInView:bookCover];

 

CGFloat deltaX = secondPoint.x - firstPoint.x;

CGFloat deltaY = secondPoint.y - firstPoint.y;

initialDistance = sqrt(deltaX * deltaX + deltaY * deltaY );

frameX = bookCover.frame.origin.x;

frameY = bookCover.frame.origin.y;

frameW = bookCover.frame.size.width;

frameH = bookCover.frame.size.height;

NSLog(@"%s %d", __FUNCTION__,__LINE__);

}

}

 

- (void)touchesMoved:(NSSet *) touches withEvent:(UIEvent *) event {

 

if([touches count] == 2)

{

NSLog(@"%s %d", __FUNCTION__,__LINE__);

 

NSArray *twoTouches = [touches allObjects];

UITouch *firstTouch = [twoTouches objectAtIndex:0];

UITouch *secondTouch = [twoTouches objectAtIndex:1];

 

CGPoint firstPoint = [firstTouch locationInView:bookCover];

CGPoint secondPoint = [secondTouch locationInView:bookCover];

 

CGFloat deltaX = secondPoint.x - firstPoint.x;

CGFloat deltaY = secondPoint.y - firstPoint.y;

CGFloat currentDistance = sqrt(deltaX * deltaX + deltaY * deltaY );

 

if (initialDistance == 0) {

initialDistance = currentDistance;

}

else if (currentDistance != initialDistance)

{

CGFloat changedDistance = currentDistance - initialDistance;

NSLog(@"changedDistance = %f",changedDistance);

[bookCover setFrame:CGRectMake(frameX - changedDistance / 2,

frameY - (changedDistance * frameH) / (2 * frameW),

frameW + changedDistance,

frameH + (changedDistance * frameH) / frameW)];

}

}

}

 

- (void)touchesEnded:(NSSet *) touches withEvent:(UIEvent *) event {

UITouch *touch = [touches anyObject];

 

UITouch雙擊圖片變大/還原

if ([touch tapCount] == 2)

{

NSLog(@"%s %d", __FUNCTION__,__LINE__);

 

if (!flag) {

[bookCover setFrame:CGRectMake(bookCover.frame.origin.x - bookCover.frame.size.width / 2,

bookCover.frame.origin.y - bookCover.frame.size.height / 2,

2 * bookCover.frame.size.width,

2 * bookCover.frame.size.height)];

flag = YES;

}

else {

[bookCover setFrame:CGRectMake(bookCover.frame.origin.x + bookCover.frame.size.width / 4, bookCover.frame.origin.y + bookCover.frame.size.height / 4,

bookCover.frame.size.width / 2, bookCover.frame.size.height / 2)];

flag = NO;

}

}

}

 

Get the Location of Touches

(CGPoint)locationInView:(UIView *)view

(CGPoint)previousLocationInView:(UIView *)view

view window

 

Getting Touch Attributes

tapCount(read only) timestamp(read only) phase(read only)

 

Getting a Touch Object's Gesture Recognizers

gestureRecognizers

 

Touch Phase

UITouchPhaseBegan

UITouchPhaseMoved

UITouchPhaseStationary

UITouchPhaseEnded

UITouchPhaseCancelled

 

從Plist里讀內容

NSString *plistPath = [[NSBundle mainBundle] pathForResource:@"book" ofType:@"plist"];

NSDictionary *dictionary = [[NSDictionary alloc] initWithContentsOfFile:plistPath];

NSString *book = [dictionary objectForKey:bookTitle];

[textView setText:book];

 

(void) initialize {

NSUserDefaults = [NSUserDefaults standardUserDefaults];

NSDictionary *appDefaults = [NSDictionary dictionaryWithObject:@"YES" forKey:@"DeleteBackup"];

[defaults registerDefaults:appDefaults];

}

 

To get a value of a default, use the valueForKey: method:

[[theDefaultsController values] valueForKey:@"userName"];

To set a value for a default, use setValue:forKey:

[[theDefaultsController values] setValue:newUserName forKey:@"userName"];

 

[[NSUserDefaults standardUserDefaults] setValue:aVale forKey:aKey];

[[NSUserDefaults standardUserDefaults] valueForKey:aKey];

 

獲取Documents目錄

NSArray *paths = NSSearchPathForDictionariesInDomains(NSDocumentDirectory,

NSUserDomainMask, YES);

NSString *documentsDirectory = [paths objectAtIndex:0];

NSString *filename = [documentsDirectory

stringByAppendingPathComponent:@"theFile.txt"];

 

獲取tmp目錄

NSString *tempPath = NSTemporaryDirectory();

NSString *tempFile = [tempPath stringByAppendingPathComponent:@"tempFile.txt"];

 

[[NSUserDefaults standardUserDefaults] setObject:data forKey:@"someKey"];

[[NSUserDefaults standardUserDefaults] objectForKey:aKey];

 

自定義NavigationBar

navigationBar = [[UINavigationBar alloc] initWithFrame:CGRectMake(0, 0, 320, 44)];

[navigationBar setBarStyle:UIBarStyleBlackOpaque];

 

myNavigationItem = [[UINavigationItem alloc] initWithTitle:@"Setting"];

[navigationBar setItems:[NSArray arrayWithObject:myNavigationItem]];

[self.view addSubview:navigationBar];

 

backButton = [[UIBarButtonItem alloc] initWithTitle:@"Back" style:UIBarButtonItemStylePlain target:self action:@selector(back)];

myNavigationItem.leftBarButtonItem = backButton;

 

 

利用Safari打開一個鏈接

NSURL *url = [NSURL URLWithString:@"http://www.cnblogs.com/tracy-e/"];

[[UIApplication sharedApplication] openURL:url];

 

利用UIWebView顯示pdf文件、網頁。。。

webView = [[UIWebView alloc] initWithFrame:CGRectMake(0, 0, 320, 480)];

[webView setDelegate:self];

[webView setScalesPageToFit:YES];

[webView setAutoresizingMask:UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight];

[webView setAllowsInlineMediaPlayback:YES];

[self.view addSubview:webView];

NSString *pdfPath = [[NSBundle mainBundle] pathForResource:@"ojc" ofType:@"pdf"];

NSURL *url = [NSURL fileURLWithPath:pdfPath];

NSURLRequest *request = [NSURLRequest requestWithURL:url

cachePolicy:NSURLRequestUseProtocolCachePolicy

timeoutInterval:5];

[webView loadRequest:request];

 

 

[myWebView loadRequest:[NSURLRequest requestWithURL:[NSURL

                       URLWithString: @"http://www.cnblogs.com/tracy-e/"]]];

 

NSString *errorString = [NSString stringWithFormat:@"<html><center><font size=

+5 color ='red'>An Error Occurred:<br>%@</fone></center></html>",error];

[myWebView loadHTMLString:errorString baseURL:nil];

 

//Stopping a load request when the view is to disappear

- (void)viewWillDisappear:(BOOL)animate{

if ([myWebView loading]){

[myWebView stopLoading];

}

myWebView.delegate = nil;

[UIApplication shareApplication].networkActivityIndicatorVisible = NO;

}

 

漢字轉碼

NSString *oriString = @"\u67aa\u738b";

NSString *escapedString = [oriString

stringByReplacingPercentEscapesUsingEncoding: NSUTF8StringEncoding];

 

 

Checking for background support on earlier versions of iOS

UIDevice *device = [UIDevice currentDevice];

BOOL backgroundSupported = NO;

if ([device respondsToSelector:@selector(isMultitaskingSupported)]){

backgroundSupported = device.multitaskingSupported;

}

 

Being a Responsible,Multitasking-Aware Application

# Do not make any OpenGL ES calls from your code.

# Cancel any Bonjour-related services before being suspended.

# Be prepared to handle connection failures in your network-based sockets.

# Save your application state before moving to the background.

# Release any unneeded memory when moving to the background.

# Stop using shared system resources before being suspended.

# Avoid updating your windows and views.

# Respond to connect and disconnect notification for external accessories.

# Clean up resource for active alerts when moving to the background.

# Remove sensitive information from views before moving to the background.

# Do minimal work while running in the background.

 

Handing the Keyboard notifications

//Call this method somewhere in your view controller setup code

- (void) registerForKeyboardNotifications{

 

[[NSNotificationCenter defaultCenter] addObserver:self

selector:@selector(keyboardWasShown:)

name:UIKeyboardDidShowNotification

object:nil];

[[NSNotificationCenter defaultCenter] addObserver:self

selector:@selector(keyboardWasHidden:)

name:UIKeyboardDidHideNotification

object:nil];

 

}

 

//Called when the UIKeyboardDidShowNotification is sent

- (void)keyboardWasShown:(NSNotification *) aNotification{

if(keyboardShown)

return;

NSDictionary *info = [aNotification userInfo];

 

//get the size of the keyboard.

NSValue *aValue = [info objectForKey:UIKeyboardFrameBeginUserInfoKey];

CGSize keyboardSize = [aValue CGRectValue].size;

 

//Resize the scroll view

CGRect viewFrame = [scrollView frame];

viewFrame.size.height -= keyboardSize.height;

 

//Scroll the active text field into view

CGRect textFieldRect = [activeField frame];

[scrollView scrollRectToVisible:textFieldRect animated:YES];

 

keyboardShown = YES;

}

 

//Called when the UIKeyboardDidHideNotification is sent

- (void)keyboardWasHidden:(NSNotification *) aNotification{

NSDictionary *info = [aNotification userInfo];

 

//Get the size of the keyboard.

NSValue *aValue = [info objectForKey:UIKeyboardFrameEndUserInfoKey];

CGSize keyboardSize = [aValue CGRectValue].size;

 

//Reset the height of the scroll view to its original value

CGRect viewFrame = [scrollView Frame];

viewFrame.size.height += keyboardSize.height;

scrollView.frame = viewFrame;

 

keyboardShown = NO;

}

 

點擊鍵盤的next按鈕,在不同的textField之間換行

//首先給不同的textField賦不同的且相鄰的tag值

- (BOOL)textFieldShouldReturn:(UITextField *)textField

{

if ([textField returnKeyType] != UIReturnKeyDone)

{

NSInteger nextTag = [textField tag] + 1;

UIView *nextTextField = [[self tableView] viewWithTag:nextTag];

[nextTextField becomeFirstResponder];

}

else {

[textField resignFirstResponder];

}

return YES;

}

 

Configuring a date formatter

- (void)viewDidLoad {

[super viewDidLoad];

dateFormatter = [[NSDateFormatter alloc] init];

[dateFormatter setGeneratesCalendarDates:YES];

[dateFormatter setLocale:[NSLocale currentLocale]];

[dateFormatter setCalendar:[NSCalendar autoupdatingCurrentCalendar]];

[dateFormatter setTimeZone:[NSTimeZone defaultTimeZone]];

[dateFormatter setDateStyle:NSDateFormatterShortStyle];

DOB.placeholder = [NSString stringWithFormat:@"Example: %@",[dateFormatter stringFromDate:[NSDate date]]];

}

 

- (void)textFieldDidEndEditing:(UITextField *)textField{

[textField resignFirstResponder];

if ([textField.text isEqualToString:@""])

return;

switch (textField.tag){

case DOBField:

NSDate *theDate = [dateFormatter dateFromString:textField.text];

if (theDate)

[inputDate setObject:theDate forKey:MyAppPersonDOBKey];

break;

default:

break;

}

}

 

 tableView的cell高度

 

tableView的cell高度除了在delegate中指定外,還可以在任意位置以[tableView setRowHeight:44]的方式指定

 

[[self navigationItem] setLeftBarButtonItem:[self editButtonItem]];

 

- (void)setEditing:(BOOL)editing animated:(BOOL)animated{

[super setEditing:editing animated:animated];

if (editing){

......

}

else{

......

}

}

 

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.

 

為UINavigationBar設置背景圖片

iPhone開發中有時候我們想給導航條添加背景圖片實現多樣化的導航條效果用其他方法往往無法達到理想的效果,經過網上搜索及多次實驗確定如下最佳實現方案:

UINavigatonBar增加如下Category(類別:提供一種為某個類添加方法而又不必編寫子類的途徑,類別只能添加成員函數,不能添加數據成員):

 

@implementation UINavigationBar (CustomImage)  

- (void)drawRect:(CGRect)rect {  

    UIImage *image = [UIImage imageNamed: @"NavigationBar.png"];  

    [image drawInRect:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)];  

}  

@end  

 

例如在我的項目中添加如下代碼:

/////////////////////////////////////////////////////////  

/* input: The image and a tag to later identify the view */  

@implementation UINavigationBar (CustomImage)  

- (void)drawRect:(CGRect)rect {  

    UIImage *image = [UIImage imageNamed: @"title_bg.png"];  

    [image drawInRect:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)];  

}  

@end  

/////////////////////////////////////////////////////////  

@implementation FriendsPageViewController  

// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.  

- (void)viewDidLoad {     

    self.navigationBar.tintColor = [UIColor purpleColor];  

      

    [self initWithRootViewController:[[RegPageViewController alloc] init]];  

    [super viewDidLoad];  

}  

......  

實現的效果如下圖:

 

 

轉載,原文地址 http://blog.csdn.net/wave_1102/archive/2009/11/04/4768212.aspx

 

為UINavigationBar添加自定義背景

 

@implementation UINavigationBar (UINavigationBarCategory) 

 

- (void)drawRect:(CGRect)rect { 

    //顏色填充 

//  UIColor *color = [UIColor redColor]; 

//  CGContextRef context = UIGraphicsGetCurrentContext(); 

//  CGContextSetFillColor(context, CGColorGetComponents( [color CGColor])); 

//  CGContextFillRect(context, rect); 

//  self.tintColor = color; 

    //圖片填充 

UIColor *color = [UIColor colorWithRed:46.0f/255.0f

green:87.0f/255.0f blue:29.0f/255.0f alpha:1.0f];

 

    UIImage *img    = [UIImage imageNamed: @"bg.png"]; 

    [img drawInRect:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)]; 

 

    self.tintColor = color; 

 

@end

 

載入圖片要及時release

 

你還在使用myImage = [UIImage imageNamed:@"icon.png"]; 嗎?

 

如題,是不是大家為了方便都這樣載入圖片啊

 

myImage = [UIImage imageNamed:@"icon.png"];

 

那麼小心了

 

這種方法在一些圖片很少,或者圖片很小的程序里是ok的。

 

但是,在大量載入圖片的程序里,請千萬不要這樣做。

 

為什麼呢 ???????

 

這種方法在application bundle的頂層文件夾尋找由供應的名字的圖象。 如果找到圖片,裝載到iPhone系統緩存圖象。那意味圖片是(理論上)放在內存里作為cache的。

 

試想你圖片多了,是什麼後果?

 

圖片cache極有可能不會響應 memory warnings and release its objects

 

所以,用圖片的時候一定要小心的allocrelease

 

推薦使用 NSString *path = [[NSBundle mainBundle] pathForResource:@"icon" ofType:@"png"];

 

myImage = [UIImage imageWithContentsOfFile:path];

 

// Todo use of myImage

 

[myImage release];

 

From: http://www.cocoachina.com/bbs/simple/?t27420.html

 

uiwebview打開doc,pdf文件

UIWebView *webView = [[UIWebView alloc]initWithFrame:CGRectMake(0, 55, 320, 300)];

    webView.delegate = self;

    webView.multipleTouchEnabled = YES;

    webView.scalesPageToFit = YES;

 

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);

    NSString *documentsDirectory = [paths objectAtIndex:0];

    NSString *docPath = [documentsDirectory stringByAppendingString:@"/doc2003_1.doc"];    NSLog(@"#######%@",docPath);

   

    NSURL *url = [NSURL fileURLWithPath:docPath];

    NSURLRequest *request = [NSURLRequest requestWithURL:url];

    [webView loadRequest:request];

   

    [self.view addSubview:webView];

[webView release];

 

From:http://blog.csdn.net/dadalan/archive/2010/10/22/5959301.aspx

 

iPhone遊戲中既播放背景音樂又播放特效聲音的辦法

 

有時候在 iPhone 遊戲中,既要播放背景音樂,同時又要播放比如槍的開火音效。此時您可以試試以下方法

 

    NSString *musicFilePath = [[NSBundle mainBundle] pathForResource:fileName ofType:@"wav"];       //創建音樂文件路徑

    NSURL *musicURL = [[NSURL alloc] initFileURLWithPath:musicFilePath]; 

    AVAudioPlayer* musicPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:musicURL error:nil];

    [musicURL release];

    [musicPlayer prepareToPlay];

    //[musicPlayer setVolume:1];            //設置音量大小

    //musicPlayer .numberOfLoops = -1;//設置音樂播放次數  -1為一直循環

 

要導入框架 AVFoundation.framework,頭文件中 #import <AVFoundation/AVFoundation.h>;做成類的話則更方便。

 

From: http://blog.csdn.net/dadalan/archive/2010/10/19/5950493.aspx

 

NSNotificationCenter用於增加回調函數

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(_willBecomeActive) name:UIApplicationDidBecomeActiveNotification object:nil];

 

UINavigationBar 背景Hack

LOGO_320×44.png 圖片顯示在背景上,

 

@implementation UINavigationBar (UINavigationBarCategory)

- (void)drawRect:(CGRect)rect {

       //加入旋轉坐標系代碼

    // Drawing code

       UIImage *navBarImage = [UIImage imageNamed:@"LOGO_320×44.png"];

       CGContextRef context = UIGraphicsGetCurrentContext();

       CGContextTranslateCTM(context, 0.0, self.frame.size.height);

       CGContextScaleCTM(context, 1.0, -1.0);      

      

       CGPoint center=self.center;

 

       CGImageRef cgImage= CGImageCreateWithImageInRect(navBarImage.CGImage, CGRectMake(0, 0, 1, 44));

       CGContextDrawImage(context, CGRectMake(center.x-160-80, 0, 80, self.frame.size.height), cgImage);

       CGContextDrawImage(context, CGRectMake(center.x-160, 0, 320, self.frame.size.height), navBarImage.CGImage);

       CGContextDrawImage(context, CGRectMake(center.x+160, 0, 80, self.frame.size.height), cgImage);

}

@end

 

old code

CGContextDrawImage(context, CGRectMake(0, 0, self.frame.size.width, self.frame.size.height), navBarImage.CGImage);

 

hack logo 不再拉伸

From: http://blog.163.com/fengyi1103@126/blog/static/13835627420106279102671/

 

清除電話號碼中的其他符號(源碼)

 

最近從通訊錄讀取電話號碼,讀出得號碼如:1341814****

而我需要的為11位純數字,一直找方法解決此問題,今天終於找到了。。

分享一下……

 

代碼如下:

 

NSString *originalString = @"(123) 123123 abc";

NSMutableString *strippedString = [NSMutableString

        stringWithCapacity:originalString.length];

 

NSScanner *scanner = [NSScanner scannerWithString:originalString];

NSCharacterSet *numbers = [NSCharacterSet

        characterSetWithCharactersInString:@"0123456789"];

 

while ([scanner isAtEnd] == NO) {

  NSString *buffer;

  if ([scanner scanCharactersFromSet:numbers intoString:&buffer]) {

    [strippedString appendString:buffer];

  }

  // --------- Add the following to get out of endless loop

  else {

     [scanner setScanLocation:([scanner scanLocation] + 1)];

  }   

  // --------- End of addition

}

 

NSLog(@"%@", strippedString); // "123123123"

 

From: http://stackoverflow.com/questions/1129521/remove-all-but-numbers-from-nsstring

 

 

正則判斷:字元串只包含字母和數字

 

NSString *mystring = @"Letter1234";

NSString *regex = @"[a-z][A-Z][0-9]";

 

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regex];

 

if ([predicate evaluateWithObject:mystring] == YES) {

    //implement

}

 

 

一行代碼設置 UITableViewCell 與導航條間距

 

UITableView  cell 默認出現在 uitableview 的第一行,如果你想自定義 UITableViewCell 與導航條間距的話,可以使用下面這行代碼

 

tableview.tableHeaderView = [[[UIView alloc] initWithFrame:CGRectMake(0, 0, 5, 20)]autorelease];

 

From: http://blog.163.com/fengyi1103@126/blog/static/1383562742010101611107492/

 

 

修改 UITableview 滾動條顏色的方法

 

    UITableview 的滾動條默認顏色是黑色的,如果 UItableview 背景也是深顏色,則滾動條會變的很不明顯。您可以用下面這行代碼來改變滾動條的顏色

 

self.tableView.indicatorStyle=UIScrollViewIndicatorStyleWhite;

 

當然,最後的 「White」 也可以換成其它顏色。

 

 

下文件之前獲取到文件大小的代碼

 

下面這段代碼,能實現在下載文件之前獲得文件大小,應用在軟體里,能在很大程度上改善用戶體驗

 

[m_pASIHTTPRequest setDidReceiveResponseHeadersSelector:@selector(didReceiveResponseHeaders:)];

 

- (void)didReceiveResponseHeaders:(ASIHTTPRequest *)request

{

    NSLog(@"didReceiveResponseHeaders %@",[m_request.responseHeaders valueForKey:@"Content-Length"]);

 

網路編程總結 iphone

 

一:確認網路環境3G/WIFI

 

    1. 添加源文件和framework

   

    開發Web等網路應用程序的時候,需要確認網路環境,連接情況等信息。如果沒有處理它們,是不會通過Apple的審(我們的)查的。

    Apple 的 常式 Reachability 中介紹了取得/檢測網路狀態的方法。要在應用程序程序中使用Reachability,首先要完成如下兩部:

   

    1.1. 添加源文件:

    在你的程序中使用 Reachability 只須將該常式中的 Reachability.h  Reachability.m 拷貝到你的工程中。如下圖:

 

   

   

    1.2.添加framework

    SystemConfiguration.framework 添加進工程。如下圖:

   

   

    2. 網路狀態

   

    Reachability.h中定義了三種網路狀態:

    typedef enum {

        NotReachable = 0,            //無連接

        ReachableViaWiFi,            //使用3G/GPRS網路

        ReachableViaWWAN            //使用WiFi網路

    } NetworkStatus;

   

    因此可以這樣檢查網路狀態:

 

    Reachability *r = [Reachability reachabilityWithHostName:@「www.apple.com」];

    switch ([r currentReachabilityStatus]) {

            case NotReachable:

                    // 沒有網路連接

                    break;

            case ReachableViaWWAN:

                    // 使用3G網路

                    break;

            case ReachableViaWiFi:

                    // 使用WiFi網路

                    break;

    }

   

    3.檢查當前網路環境

    程序啟動時,如果想檢測可用的網路環境,可以像這樣

    // 是否wifi

    + (BOOL) IsEnableWIFI {

        return ([[Reachability reachabilityForLocalWiFi] currentReachabilityStatus] != NotReachable);

    }

 

    // 是否3G

    + (BOOL) IsEnable3G {

        return ([[Reachability reachabilityForInternetConnection] currentReachabilityStatus] != NotReachable);

    }

    例子:

    - (void)viewWillAppear:(BOOL)animated {   

    if (([Reachability reachabilityForInternetConnection].currentReachabilityStatus == NotReachable) &&

            ([Reachability reachabilityForLocalWiFi].currentReachabilityStatus == NotReachable)) {

            self.navigationItem.hidesBackButton = YES;

            [self.navigationItem setLeftBarButtonItem:nil animated:NO];

        }

    }

 

    4. 鏈接狀態的實時通知

    網路連接狀態的實時檢查,通知在網路應用中也是十分必要的。接續狀態發生變化時,需要及時地通知用戶:

   

    Reachability 1.5版本

    // My.AppDelegate.h

    #import "Reachability.h"

 

    @interface MyAppDelegate : NSObject <UIApplicationDelegate> {

        NetworkStatus remoteHostStatus;

    }

 

    @property NetworkStatus remoteHostStatus;

 

    @end

 

    // My.AppDelegate.m

    #import "MyAppDelegate.h"

 

    @implementation MyAppDelegate

    @synthesize remoteHostStatus;

 

    // 更新網路狀態

    - (void)updateStatus {

        self.remoteHostStatus = [[Reachability sharedReachability] remoteHostStatus];

    }

 

    // 通知網路狀態

    - (void)reachabilityChanged:(NSNotification *)note {

        [self updateStatus];

        if (self.remoteHostStatus == NotReachable) {

            UIAlertView *alert = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"AppName", nil)

                         message:NSLocalizedString (@"NotReachable", nil)

                        delegate:nil cancelButtonTitle:@"OK" otherButtonTitles: nil];

            [alert show];

            [alert release];

        }

    }

 

    // 程序啟動器,啟動網路監視

    - (void)applicationDidFinishLaunching:(UIApplication *)application {

   

        // 設置網路檢測的站點

        [[Reachability sharedReachability] setHostName:@"www.apple.com"];

        [[Reachability sharedReachability] setNetworkStatusNotificationsEnabled:YES];

        // 設置網路狀態變化時的通知函數

        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(reachabilityChanged:)

                                                 name:@"kNetworkReachabilityChangedNotification" object:nil];

        [self updateStatus];

    }

 

    - (void)dealloc {

        // 刪除通知對象

        [[NSNotificationCenter defaultCenter] removeObserver:self];

        [window release];

        [super dealloc];

    }

   

    Reachability 2.0版本

   

 

    // MyAppDelegate.h

    @class Reachability;

 

        @interface MyAppDelegate : NSObject <UIApplicationDelegate> {

            Reachability  *hostReach;

        }

 

    @end

 

    // MyAppDelegate.m

    - (void)reachabilityChanged:(NSNotification *)note {

        Reachability* curReach = [note object];

        NSParameterAssert([curReach isKindOfClass: [Reachability class]]);

        NetworkStatus status = [curReach currentReachabilityStatus];

   

        if (status == NotReachable) {

            UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"AppName""

                              message:@"NotReachable"

                              delegate:nil

                              cancelButtonTitle:@"YES" otherButtonTitles:nil];

                              [alert show];

                              [alert release];

        }

    }

                             

    - (void)applicationDidFinishLaunching:(UIApplication *)application {

        // ...

                 

        // 監測網路情況

        [[NSNotificationCenter defaultCenter] addObserver:self

                              selector:@selector(reachabilityChanged:)

                              name: kReachabilityChangedNotification

                              object: nil];

        hostReach = [[Reachability reachabilityWithHostName:@"www.google.com"] retain];

        hostReach startNotifer];

        // ...

    }

 

 

二:使用NSConnection下載數據

   

    1.創建NSConnection對象,設置委託對象

   

    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:[self urlString]]];

    [NSURLConnection connectionWithRequest:request delegate:self];

   

    2. NSURLConnection delegate委託方法

        - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response; 

        - (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error; 

        - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data; 

        - (void)connectionDidFinishLoading:(NSURLConnection *)connection; 

 

    3. 實現委託方法

    - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {

        // store data

        [self.receivedData setLength:0];            //通常在這裡先清空接受數據的緩存

    }

   

    - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {

           /* appends the new data to the received data */

        [self.receivedData appendData:data];        //可能多次收到數據,把新的數據添加在現有數據最後

    }

 

    - (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error {

        // 錯誤處理

    }

 

    - (void)connectionDidFinishLoading:(NSURLConnection *)connection {

        // disconnect

        [UIApplication sharedApplication].networkActivityIndicatorVisible = NO;  

        NSString *returnString = [[NSString alloc] initWithData:self.receivedData encoding:NSUTF8StringEncoding];

        NSLog(returnString);

        [self urlLoaded:[self urlString] data:self.receivedData];

        firstTimeDownloaded = YES;

    }

 

三:使用NSXMLParser解析xml文件

 

    1. 設置委託對象,開始解析

    NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data];   //或者也可以使用initWithContentsOfURL直接下載文件,但是有一個原因不這麼做:

    // It's also possible to have NSXMLParser download the data, by passing it a URL, but this is not desirable

    // because it gives less control over the network, particularly in responding to connection errors.

    [parser setDelegate:self];

    [parser parse];

 

    2. 常用的委託方法

    - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName

                                namespaceURI:(NSString *)namespaceURI

                                qualifiedName:(NSString *)qName

                                attributes:(NSDictionary *)attributeDict;

    - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName

                                namespaceURI:(NSString *)namespaceURI

                                qualifiedName:(NSString *)qName;

    - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string;

    - (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError;

 

    static NSString *feedURLString = @"http://www.yifeiyang.net/test/test.xml";

 

    3.  應用舉例

    - (void)parseXMLFileAtURL:(NSURL *)URL parseError:(NSError **)error

    {

        NSXMLParser *parser = [[NSXMLParser alloc] initWithContentsOfURL:URL];

        [parser setDelegate:self];

        [parser setShouldProcessNamespaces:NO];

        [parser setShouldReportNamespacePrefixes:NO];

        [parser setShouldResolveExternalEntities:NO];

        [parser parse];

        NSError *parseError = [parser parserError];

        if (parseError && error) {

            *error = parseError;

        }

        [parser release];

    }

 

    - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI

                                        qualifiedName:(NSString*)qName attributes:(NSDictionary *)attributeDict{

        // 元素開始句柄

        if (qName) {

            elementName = qName;

        }

        if ([elementName isEqualToString:@"user"]) {

            // 輸出屬性值

            NSLog(@"Name is %@ , Age is %@", [attributeDict objectForKey:@"name"], [attributeDict objectForKey:@"age"]);

        }

    }

 

    - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI

                                        qualifiedName:(NSString *)qName

    {

        // 元素終了句柄

        if (qName) {

               elementName = qName;

        }

    }

 

    - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string

    {

        // 取得元素的text

    }

 

    NSError *parseError = nil;

    [self parseXMLFileAtURL:[NSURL URLWithString:feedURLString] parseError:&parseError];

 

Iphone 實現畫折線圖

 

iphone裡面要畫圖一般都是通過CoreGraphics.framworkQuartzCore.framwork實現,apple的官方sdk demon中包含了QuartzCore的基本用法,

 

具體demo請參考http://developer.apple.com/library/ios/#samplecode/QuartzDemo/

折線圖

 

 

要實現折線圖也就把全部的點連起來,movePointLineto,具體的調用裡面的api就可以實現了,但是畫坐標就比較麻煩了,裡面需要去轉很多,好在國外有人開源了一個畫折線圖的開發包,首先看看效果吧,具體怎麼用可以參考作者git版本庫中的wiki

http://github.com/devinross/tapkulibrary/wiki/How-To-Use-This-Library

這個包還提供了其他的很好看的UI,都可以調來用,但是我們只需要一個畫圖要把整個包都導進去,工程太大了,既然是開源的那就想辦法提取出來吧,原先之前也有人干過這樣的事。http://duivesteyn.net/2010/03/07/iphone-sdk-implementing-the-tapku-graph-in-your-application/

我對源代碼進行簡單的修改,使其顯示坐標之類的,更加符合工程的需要,但是還沒有實現畫多組數據,只能畫一組數據,不用viewContol,而使用addsubview,直接添加到當前的窗口,最終效果如下。

使用方法:

1.工程添加tk庫裡面的如下文件

2. 添加QuartzCore  framework

#import <QuartzCore/QuartzCore.h>

添加TapkuLibrary.bundle資源文件

3.代碼中完成實例,數據初始化就可以用了

下載修改後的版本。下次有時間在整理一個工程版本出來。

 

讓iPhone屏幕常亮不變暗的方法

 

如果您希望運行自己開發的App時,iPhone的屏幕不再自動變暗,可以使用以下方法讓屏幕常亮: iPhone OS用一個布爾值用來控制是否取消應用程序空閑時間:@property(nonatomic, getter=isIdleTime

 

如果您希望運行自己開發的App時,iPhone的屏幕不再自動變暗,可以使用以下方法讓屏幕常亮:

 

  iPhone OS用一個布爾值用來控制是否取消應用程序空閑時間:@property(nonatomic, getter=isIdleTimerDisabled) BOOL idleTimerDisabled。這個值的默認屬性是"NO"。當大多數應用程序沒有接收到用戶輸入信息的時候,系統會把設備設置成「休眠」狀態,iPhone屏幕也會變暗。這樣做是為了保存更多電量。事實上,應用程序在運行加速度遊戲的時候是不需要用戶輸入的,當然這裡只是一個假設,把這個變數設置為"YES",來取消系統休眠的「空閑時間」。

 

重點是:你必須當真正需要的時候才打開這個屬性當你不用的時候馬上還願成"NO"。大多數應用程序在休眠時間到的時候讓系統關閉屏幕。這個包括了有音頻的應用程 序。在Audio Session Services中使用適當的回放和記錄功能不會被間斷當屏幕關閉時。只有地圖應用程序,遊戲或者一些不間斷的用戶交互程序可以取消這個屬性。

 

蘋果開發網路編程知識總結

 

以下蘋果開發網路編程知識由 CocoaChina 會員 cocoa_yang 總結,希望能為蘋果開發新手梳理知識脈絡,節省入門時間。一:確認網路環境3G/WIFI 1. 添加源文件和framework 開發Web等網路應用程序

 

  以下蘋果開發網路編程知識由 CocoaChina 會員 「cocoa_yang」 總結,希望能為蘋果開發新手梳理知識脈絡,節省入門時間。

 

一:確認網路環境3G/WIFI

 

    1. 添加源文件和framework

   

    開發Web等網路應用程序的時候,需要確認網路環境,連接情況等信息。如果沒有處理它們,是不會通過Apple的審查的。

    Apple 的 常式 Reachability 中介紹了取得/檢測網路狀態的方法。要在應用程序程序中使用Reachability,首先要完成如下兩部:

   

    1.1. 添加源文件:

    在你的程序中使用 Reachability 只須將該常式中的 Reachability.h  Reachability.m 拷貝到你的工程中。如下圖:

   

    1.2.添加framework

    SystemConfiguration.framework 添加進工程。如下圖:

   

   

    2. 網路狀態

   

    Reachability.h中定義了三種網路狀態:

    typedef enum {

        NotReachable = 0,            //無連接

        ReachableViaWiFi,            //使用3G/GPRS網路

        ReachableViaWWAN            //使用WiFi網路

    } NetworkStatus;

   

    因此可以這樣檢查網路狀態:

 

    Reachability *r = [Reachability reachabilityWithHostName:@「www.apple.com」];

    switch ([r currentReachabilityStatus]) {

            case NotReachable:

                    // 沒有網路連接

                    break;

            case ReachableViaWWAN:

                    // 使用3G網路

                    break;

            case ReachableViaWiFi:

                    // 使用WiFi網路

                    break;

    }

   

    3.檢查當前網路環境

 

    程序啟動時,如果想檢測可用的網路環境,可以像這樣

    // 是否wifi

    + (BOOL) IsEnableWIFI {

        return ([[Reachability reachabilityForLocalWiFi] currentReachabilityStatus] != NotReachable);

    }

 

    // 是否3G

    + (BOOL) IsEnable3G {

        return ([[Reachability reachabilityForInternetConnection] currentReachabilityStatus] != NotReachable);

    }

    例子:

    - (void)viewWillAppear:(BOOL)animated {   

    if (([Reachability reachabilityForInternetConnection].currentReachabilityStatus == NotReachable) &&

            ([Reachability reachabilityForLocalWiFi].currentReachabilityStatus == NotReachable)) {

            self.navigationItem.hidesBackButton = YES;

            [self.navigationItem setLeftBarButtonItem:nil animated:NO];

        }

    }

 

    4. 鏈接狀態的實時通知

 

    網路連接狀態的實時檢查,通知在網路應用中也是十分必要的。接續狀態發生變化時,需要及時地通知用戶:

   

    Reachability 1.5版本

    // My.AppDelegate.h

    #import "Reachability.h"

 

    @interface MyAppDelegate : NSObject <UIApplicationDelegate> {

        NetworkStatus remoteHostStatus;

    }

 

    @property NetworkStatus remoteHostStatus;

 

    @end

 

    // My.AppDelegate.m

    #import "MyAppDelegate.h"

 

    @implementation MyAppDelegate

    @synthesize remoteHostStatus;

 

    // 更新網路狀態

    - (void)updateStatus {

        self.remoteHostStatus = [[Reachability sharedReachability] remoteHostStatus];

    }

 

    // 通知網路狀態

    - (void)reachabilityChanged:(NSNotification *)note {

        [self updateStatus];

        if (self.remoteHostStatus == NotReachable) {

            UIAlertView *alert = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"AppName", nil)

                         message:NSLocalizedString (@"NotReachable", nil)

                        delegate:nil cancelButtonTitle:@"OK" otherButtonTitles: nil];

            [alert show];

            [alert release];

        }

    }

 

    // 程序啟動器,啟動網路監視

    - (void)applicationDidFinishLaunching:(UIApplication *)application {

   

        // 設置網路檢測的站點

        [[Reachability sharedReachability] setHostName:@"www.apple.com"];

        [[Reachability sharedReachability] setNetworkStatusNotificationsEnabled:YES];

        // 設置網路狀態變化時的通知函數

        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(reachabilityChanged:)

                                                 name:@"kNetworkReachabilityChangedNotification" object:nil];

        [self updateStatus];

    }

 

    - (void)dealloc {

        // 刪除通知對象

        [[NSNotificationCenter defaultCenter] removeObserver:self];

        [window release];

        [super dealloc];

    }

   

    Reachability 2.0版本

   

 

    // MyAppDelegate.h

    @class Reachability;

 

        @interface MyAppDelegate : NSObject <UIApplicationDelegate> {

            Reachability  *hostReach;

        }

 

    @end

 

    // MyAppDelegate.m

    - (void)reachabilityChanged:(NSNotification *)note {

        Reachability* curReach = [note object];

        NSParameterAssert([curReach isKindOfClass: [Reachability class]]);

        NetworkStatus status = [curReach currentReachabilityStatus];

   

        if (status == NotReachable) {

            UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"AppName""

                              message:@"NotReachable"

                              delegate:nil

                              cancelButtonTitle:@"YES" otherButtonTitles:nil];

                              [alert show];

                              [alert release];

        }

    }

                             

    - (void)applicationDidFinishLaunching:(UIApplication *)application {

        // ...

                 

        // 監測網路情況

        [[NSNotificationCenter defaultCenter] addObserver:self

                              selector:@selector(reachabilityChanged:)

                              name: kReachabilityChangedNotification

                              object: nil];

        hostReach = [[Reachability reachabilityWithHostName:@"www.google.com"] retain];

        hostReach startNotifer];

        // ...

    }

 

 

二:使用NSConnection下載數據

   

    1.創建NSConnection對象,設置委託對象

   

    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:[self urlString]]];

    [NSURLConnection connectionWithRequest:request delegate:self];

   

    2. NSURLConnection delegate委託方法

        - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response; 

        - (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error; 

        - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data; 

        - (void)connectionDidFinishLoading:(NSURLConnection *)connection; 

 

    3. 實現委託方法

    - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {

        // store data

        [self.receivedData setLength:0];            //通常在這裡先清空接受數據的緩存

    }

   

    - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {

           /* appends the new data to the received data */

        [self.receivedData appendData:data];        //可能多次收到數據,把新的數據添加在現有數據最後

    }

 

    - (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error {

        // 錯誤處理

    }

 

    - (void)connectionDidFinishLoading:(NSURLConnection *)connection {

        // disconnect

        [UIApplication sharedApplication].networkActivityIndicatorVisible = NO; 

        NSString *returnString = [[NSString alloc] initWithData:self.receivedData encoding:NSUTF8StringEncoding];

        NSLog(returnString);

        [self urlLoaded:[self urlString] data:self.receivedData];

        firstTimeDownloaded = YES;

    }

 

三:使用NSXMLParser解析xml文件

 

    1. 設置委託對象,開始解析

    NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data];   //或者也可以使用initWithContentsOfURL直接下載文件,但是有一個原因不這麼做:

    // It's also possible to have NSXMLParser download the data, by passing it a URL, but this is not desirable

    // because it gives less control over the network, particularly in responding to connection errors.

    [parser setDelegate:self];

    [parser parse];

 

    2. 常用的委託方法

    - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName

                                namespaceURI:(NSString *)namespaceURI

                                qualifiedName:(NSString *)qName

                                attributes:(NSDictionary *)attributeDict;

    - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName

                                namespaceURI:(NSString *)namespaceURI

                                qualifiedName:(NSString *)qName;

    - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string;

    - (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError;

 

    static NSString *feedURLString = @"http://www.yifeiyang.net/test/test.xml";

 

    3.  應用舉例

    - (void)parseXMLFileAtURL:(NSURL *)URL parseError:(NSError **)error

    {

        NSXMLParser *parser = [[NSXMLParser alloc] initWithContentsOfURL:URL];

        [parser setDelegate:self];

        [parser setShouldProcessNamespaces:NO];

        [parser setShouldReportNamespacePrefixes:NO];

        [parser setShouldResolveExternalEntities:NO];

        [parser parse];

        NSError *parseError = [parser parserError];

        if (parseError && error) {

            *error = parseError;

        }

        [parser release];

    }

 

    - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI

                                        qualifiedName:(NSString*)qName attributes:(NSDictionary *)attributeDict{

        // 元素開始句柄

        if (qName) {

            elementName = qName;

        }

        if ([elementName isEqualToString:@"user"]) {

            // 輸出屬性值

            NSLog(@"Name is %@ , Age is %@", [attributeDict objectForKey:@"name"], [attributeDict objectForKey:@"age"]);

        }

    }

 

    - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI

                                        qualifiedName:(NSString *)qName

    {

        // 元素終了句柄

        if (qName) {

               elementName = qName;

        }

    }

 

    - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string

    {

        // 取得元素的text

    }

 

    NSError *parseError = nil;

    [self parseXMLFileAtURL:[NSURL URLWithString:feedURLString] parseError:&parseError];

 

如何隱藏狀態欄

[ UIApplication sharedApplication ].statusBarHidden = YES;

 

.m 文件與.mm文件的區別

.m文件是object-c文件

.mm文件相當於c++或者c文件

 

NSLog(@"afd")與 NSLog("afd")

 

細微差別會導致程序崩潰。

 

但是我不太明白為何蘋果要把編譯器做的對這兩種常量有區別。

 

不過值得一提的是可能為了方便蘋果自身的NSObject對象的格式化輸出。

 

safari其實沒有把內存的緩存寫到存儲卡上

 

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.

 

官方文檔是這麼說的。

 

為了證明這個,我找到了一個目錄。

 

/private/var/mobile/Library/Caches/Safari/Thumbnails

 

隨機數的使用

 

        頭文件的引用

        #import <time.h>

        #import <mach/mach_time.h>

 

        srandom()的使用

        srandom((unsigned)(mach_absolute_time() & 0xFFFFFFFF));

 

        直接使用 random() 來調用隨機數

 

在UIImageView 中旋轉圖像

 

        float rotateAngle = M_PI;

        CGAffineTransform transform =CGAffineTransformMakeRotation(rotateAngle);

        imageView.transform = transform;

      

        以上代碼旋轉imageView, 角度為rotateAngle, 方向可以自己測試哦!

 

 

在Quartz中如何設置旋轉點

 

        UIImageView *imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"bg.png"]];

        imageView.layer.anchorPoint = CGPointMake(0.5, 1.0);

 

        這個是把旋轉點設置為底部中間。記住是在QuartzCore.framework中才得到支持。

 

創建.plist文件並存儲

 

        NSString *errorDesc;  //用來存放錯誤信息

        NSMutableDictionary *rootObj = [NSMutableDictionary dictionaryWithCapacity:4]; //NSDictionary, NSData等文件可以直接轉化為plist文件

        NSDictionary *innerDict;

        NSString *name;

        Player *player;

        NSInteger saveIndex;

   

        for(int i = 0; i < [playerArray count]; i++) {

              player = nil;

              player = [playerArray objectAtIndex:i];

              if(player == nil)

                     break;

              name = player.playerName;// This "Player1" denotes the player name could also be the computer name

              innerDict = [self getAllNodeInfoToDictionary:player];

              [rootObj setObject:innerDict forKey:name]; // This "Player1" denotes the person who start this game

        }

        player = nil;

        NSData *plistData = [NSPropertyListSerialization dataFromPropertyList:(id)rootObj format:NSPropertyListXMLFormat_v1_0 errorDescription:&errorDesc];

 

        紅色部分可以忽略,只是給rootObj添加一點內容。這個plistData為創建好的plist文件,用其writeToFile方法就可以寫成文件。下面是代碼:

       

        /*得到移動設備上的文件存放位置*/

        NSString *documentsPath = [self getDocumentsDirectory];

        NSString *savePath = [documentsPath stringByAppendingPathComponent:@"save.plist"];

   

        /*存文件*/

        if (plistData) {

                [plistData writeToFile:savePath atomically:YES];

         }

         else {

                NSLog(errorDesc);

                [errorDesc release];

        }

 

        - (NSString *)getDocumentsDirectory { 

                NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 

                return [paths objectAtIndex:0]; 

        }

 

讀取plist文件並轉化為NSDictionary

 

        NSString *documentsPath = [self getDocumentsDirectory];

        NSString *fullPath = [documentsPath stringByAppendingPathComponent:@"save.plist"];

        NSMutableDictionary* plistDict = [[NSMutableDictionary alloc] initWithContentsOfFile:fullPath];

 

讀取一般性文檔文件

 

        NSString *tmp;

        NSArray *lines; /*將文件轉化為一行一行的*/

        lines = [[NSString    stringWithContentsOfFile:@"testFileReadLines.txt"]

                       componentsSeparatedByString:@"\n"];

   

         NSEnumerator *nse = [lines objectEnumerator];

   

         // 讀取<>里的內容

         while(tmp = [nse nextObject]) {

                  NSString *stringBetweenBrackets = nil;

                  NSScanner *scanner = [NSScanner scannerWithString:tmp];

                  [scanner scanUpToString:@"<" intoString:nil];

                  [scanner scanString:@"<" intoString:nil];

                  [scanner scanUpToString:@">" intoString:&stringBetweenBrackets];

 

                  NSLog([stringBetweenBrackets description]);

          }

 

對於讀寫文件,還有補充,暫時到此。隨機數和文件讀寫在遊戲開發中經常用到。所以把部分內容放在這,以便和大家分享,也當記錄,便於查找。

 

隱藏NavigationBar

[self.navigationController setNavigationBarHidden:YES animated:YES];

 

在想隱藏的ViewController中使用就可以了。

 

如何在iPhone程序中調用外部命令

 

下面是如何在iPhone非官方SDK程序中調用外部命令的方法。

 

- ( NSString * ) executeCommand : ( NSString * ) cmd { NSString * output = [ NSString string ] ; FILE * pipe = popen ( [ cmd cStringUsingEncoding : NSASCIIStringEnc

  

下面是如何在iPhone非官方SDK程序中調用外部命令的方法。

 

- (NSString *)executeCommand: (NSString *)cmd

{

    NSString *output = [NSString string];

    FILE *pipe = popen([cmd cStringUsingEncoding: NSASCIIStringEncoding], "r");

    if (!pipe) return;

 

    char buf[1024];

    while(fgets(buf, 1024, pipe)) {

    output = [output stringByAppendingFormat: @"%s", buf];

}

 

pclose(pipe);

return output;

}

 

NSString *yourcmd = [NSString stringWithFormat: @"your command"];

[self executeCommand: yourcmd];

 

如何在iPhone程序讀取數據時顯示進度窗

 

下面代碼說明如何使用iPhone 非官方SDK在讀取數據時顯示進度條。

 

以下代碼參考了MobileRss

 

定義頭文件:

 

#import "uikit/UIProgressHUD.h"

 

@interface EyeCandy : UIApplication {

 UIProgressHUD *progress;

}

 

- (void) showProgressHUD:(NSString *)label withWindow:(UIWindow *)w withView:(UIView *)v withRect:(struct CGRect)rect;

- (void) hideProgressHUD;

 

.@end

 

上面的引號要改成<>

 

import "EyeCandy.h"

 

@implementation EyeCandy

- (void)showProgressHUD:(NSString *)label withWindow:(UIWindow *)w withView:(UIView *)v withRect:(struct CGRect)rect

{

 progress = [[UIProgressHUD alloc] initWithWindow: w];

 [progress setText: label];

 [progress drawRect: rect];

 [progress show: YES];

 

 [v addSubview:progress];

}

 

- (void)hideProgressHUD

{

 [progress show: NO];

 [progress removeFromSuperview];

}

 

@end

 

使用下面代碼調用:

 

// Setup Eye Candy View

_eyeCandy = [[[EyeCandy alloc] init] retain];

 

// Call loading display

[_eyeCandy showProgressHUD:@"Loading …" withWindow:window withView:mainView withRect:CGRectMake(0.0f, 100.0f, 320.0f, 50.0f)];

 

// When finished for hiding the &quot;loading text&quot;

[_eyeCandy hideProgressHUD];

 

WebKit的基本用法

 

WebKit是蘋果開發中比較常用的瀏覽器引擎,Safari使用的正是WebKit引擎。WebKit基於KDEKHTML加以再開發,解析速度超過了以往所有的瀏覽器。這裡簡單記錄一下WebKit的基本用法。

 

WebKit由下面的結構組成:

 

DomCore

JavaScriptCore

WebCore

一般瀏覽

 

要打開網頁,可以這樣做:

 

1.[[webView mainFrame] loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:urlText]]];

DomCore

 

DomCore用於處理DOM文檔,包括:

 

DOMDocument

DOMNamedNodeMap

DOMNode

DOMNodeList

要獲取一個DOMDocument,可以這樣做:

 

1.DOMDocument *myDOMDocument = [[webView mainFrame] DOMDocument];

要用於HTML處理,可以使用DOMHTMLDocumentMac OS X 10.4之後),獲取方式相同:

 

1.DOMHTMLDocument *myDOMDocument = (DOMHTMLDocument*)[[webView mainFrame] DOMDocument];

方法定義:

 

蘋果的WebKit更新說明

 

JavaScriptCore

 

WebKit中執行腳本的方法:

 

1.WebScriptObject *myscript = [webView windowScriptObject];

2.NSString *script = @"alert('hello');";

3.[myscript evaluateWebScript script];

參考:

 

http://www.macgood.com/thread-24636-1-1.html

 

http://www.cocoadev.com/index.pl?WebKit

 

為什麼不要做iPhone上面的應用

 

簡單來說就是因為兩國的文化不同,或者說生活方式的不同。美國不管多窮的人都有車,他們平時的生活方式和國內絕對是完全不同的。做應用和做遊戲不一樣,應用需要滿足人們某一

  簡單來說就是因為兩國的文化不同,或者說生活方式的不同。美國不管多窮的人都有車,他們平時的生活方式和國內絕對是完全不同的。做應用和做遊戲不一樣,應用需要滿足人們某一部分的需求,比如,一個計算小費的軟體,在國內不會有市場,可是美國人都有一個。

大家可以設身處地的想一下,誰會需要你做的軟體,這樣的人有多少,這樣的人又有iPhone的又有多少。

 

對於應用來說,針對商務人士的又比針對普通人的好,基本上商務人士不太在乎幾塊錢一個軟體,這也是backup assistant賣得最好的一個原因。這個軟體一年的年費24美元,大約有數千萬美元一年的收入。什麼樣的應用軟體是這些人需要的?連筆者自己也不太清楚,筆者雖然已經在美國工作了多年,但是對於美國文化的了解還處於一知半解狀態,更不用說正在留學的學生了。

 

還有一個能成功的應用軟體是你已經有非常多的數據,比如你有當地的所有加油站的信息,做一個油價的地圖軟體,顯然市場會不錯。不過數據要是美國的數據,國內的沒有太大的幫助。

 

綜上所述,遊戲比應用好做很多,如果要作應用的話,可以從單機的小應用開始。要在美國運營一個支持10萬人的網路應用,沒有30萬美元絕對沒戲。如果非要上,只能早死早超生了。

 

獲取iPhone用戶手機號

 

使用下面的函數可以返回用戶的手機號:

 

extern NSString *CTSettingCopyMyPhoneNumber();

 

然後調用即可。

 

由於這個函數是包含在CoreTelephony中,所以只能用於非官方iPhone SDK

 

在程序中關閉iPhone

首先在程序中引用 #include sys/reboot.h 然後使用 reboot(RB_HALT); 就可以直接將iPhone關機。

  

首先在程序中引用

 

#include <sys/reboot.h>

 

然後使用

 

reboot(RB_HALT);

 

就可以直接將iPhone關機。

 

convert the contents of an NSData object to an NSString

 

1. NSString *stringFromASC = [NSString stringWithCString:[ascData bytes] length:[ascData length]];

 

If the NSData object contains unichar characters then do this:

 

NSString *stringFromUnichar = [NSString stringWithCharacters:[unicharData bytes] length:[unicharData length] / sizeof(unichar)];

 

2. - (id)initWithData:(NSData *)data encoding:(NSStringEncoding)encoding

 

iPhone的特殊URL

iPhone中,可以直接用UIApp打開URL地址。如下所示:

 

1.[ UIApp openURL: [ NSURL URLWithString:@"http://www.apple.com" ] ];

或者:

 

1.[ UIApp openURL: [ NSURL URLWithString:@"mailto:apple@mac.com?Subject=hello" ] ];

與此同時,iPhone還包含一些其他除了http://或者mailto:之外的URL

 

sms:// 可以調用簡訊程序

 

tel:// 可以撥打電話

 

itms:// 可以打開MobileStore.app

 

audio-player-event:// 可以打開iPod

 

audio-player-event://?uicmd=show-purchased-playlist 可以打開iPod播放列表

 

video-player-event:// 可以打開iPod中的視頻

 

 

get iphone uniqueIdentifier

 

I also find that I can get uniqueIdentifier using:

 

UIDevice *myDevice = [UIDevice currentDevice];NSString *identifier = myDevice.uniqueIdentifier;

 

 

打開本地網頁,與遠程網頁

 

fileURLWithPath:Initializes and returns a newly created NSURL object as a file URL with a specified path.

 

+ (id)fileURLWithPath:(NSString *)path

 

URLWithString:

Creates and returns an NSURL object initialized with a provided string.

 

+ (id)URLWithString:(NSString *)URLString

 

教你如何使用UIWebView

 

Start by opening up the WebBrowserTutorialAppDelegate.h file and editing the @interface line to read:

 

@interface WebBrowserTutorialAppDelegate : NSObject <UIWebViewDelegate> {

What we have done is to make the main AppDelegate a delegate for the UIWebView as well.

 

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:

 

webView.delegate = self;

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.

 

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:

 

- (BOOL)webView:(UIWebView*)webView shouldStartLoadWithRequest:(NSURLRequest*)request navigationType:(UIWebViewNavigationType)navigationType {

       NSURL *url = request.URL;

       NSString *urlString = url.absoluteString;

       NSLog(urlString);

       return YES;

}

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.

 

The first line gets the URL of the request, this is the contents inside the href attribute in the anchor tag.

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.

 

* absoluteString - An absolute string for the URL. Creating by resolving the receiver』s string against its base.

* absoluteURL - An absolute URL that refers to the same resource as the receiver. If the receiver is already absolute, returns self.

* baseURL - The base URL of the receiver. If the receiver is an absolute URL, returns nil.

* host - The host of the URL.

* parameterString - The parameter string of the URL.

* password - The password of the URL (i.e. http://user:pass@www.test.com would return pass)

* path - Returns the path of a URL.

* port - The port number of the URL.

* query - The query string of the URL.

* 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.

* 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.

* scheme - The resource specifier of the URL (i.e. http, https, file, ftp, etc).

* user - The user portion of the URL.

 

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.

 

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.

 

UIBUtton title image 不能同時顯示

 

[ leftbutton setTitle:_(@"About") forState:UIControlStateNormal ];

 

 

[ leftbutton setImage:image forState:UIControlStateNormal ];

 

不能同時顯示。

 

其他控制項如:UINavigatonItem

 

不要在語言包裡面設置空格

有時,為了界面的需要,我們不要在語言包裡面加空格,要在程序中進行控制。

buttonTitle = [ NSString stringWithFormat:@"        %@", _(@"updateWeb") ];

 

NSNotificationCenter 帶參數發送

 

MPMoviePlayerController* theMovie = [[MPMoviePlayerController alloc]initWithContentURL:[NSURL fileURLWithPath:[[[tableTitles objectForKey:keyIndex] objectAtIndex:row] objectAtIndex:3] ]];

 

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(myMovieFinishedCallback:) name:MPMoviePlayerPlaybackDidFinishNotification object:theMovie];

 

[theMovie play];

 

-(void)myMovieFinishedCallback:(NSNotification*)aNotification

 

{

 

     MPMoviePlayerController *theMovie = [aNotification object];

 

   [[NSNotificationCenter defaultCenter] removeObserver:self           name:MPMoviePlayerPlaybackDidFinishNotification object:theMovie];

 

   // Release the movie instance [theMovie release];

 

}

 

------------

 

MPMoviePlayerController* theMovie = [[MPMoviePlayerController alloc]initWithContentURL:[NSURL fileURLWithPath:[[[tableTitles objectForKey:keyIndex] objectAtIndex:row] objectAtIndex:3] ]];

 

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(myMovieFinishedCallback:) name:MPMoviePlayerPlaybackDidFinishNotification object:theMovie userInfo:dic];

 

[theMovie play];

 

-(void)myMovieFinishedCallback:(NSNotification*)aNotification

 

{

 

MPMoviePlayerController *theMovie = [aNotification object];

 

[[NSNotificationCenter defaultCenter] removeObserver:self name:MPMoviePlayerPlaybackDidFinishNotification object:theMovie];

 

// Release the movie instance [theMovie release];

 

}

 

延時一段時間執行某一函數

 

[self performSelector:@selector(dismissModal) withObject:self afterDelay:1.0];

 

無99美金證書聯機開發

第一步:進入 cd /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS4.1.sdk/ sudo vi SDKSettings.plist,CODE_SIGNING_REQUIRED的值改成NO. 保存後退出.

 

第二步:重新啟動XCode項目.

 

第三步:右擊項目GetInfo.Code Signing下的Code Signing Identity值設置成Don't Code Sign, Code Signing Identity下的Any iOS Device的值設置成空.

 

獲取IOS設備的基本信息

系統唯一標識

是什麼設備:iPad還是iPhone

iOS版本號

系統名稱

 

[[UIDevice currentDevice] uniqueIdentifier],

                       [[UIDevice currentDevice] localizedModel],

                       [[UIDevice currentDevice] systemVersion],

                       [[UIDevice currentDevice] systemName],

                       [[UIDevice currentDevice] model]];

 

用NSDateFormatter調整時間格式的代碼

 

在開發iOS程序時,有時候需要將時間格式調整成自己希望的格式,這個時候我們可以用NSDateFormatter類來處理。

例如:

 

//實例化一個NSDateFormatter對象

 

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];

 

//設定時間格式,這裡可以設置成自己需要的格式

 

[dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];

 

//[NSDate date]可以獲取系統當前時間

 

NSString *currentDateStr = [dateFormatter stringFromDate:[NSDate date]];

 

//輸出格式為:2010-10-27 10:22:13

 

NSLog(@」%@」,currentDateStr);

 

//alloc后對不使用的對象別忘了release

 

[dateFormatter release];

 

UIView設置成圓角方法

 

m_mainImgView.layer.cornerRadius = 6;

m_mainImgView.layer.masksToBounds = YES;

 

iPhone里的frame和bounds區別

 

 

Objective-C內存管理

 

在使用Objective-C的工作中內存管理是首先要學會的一項技能,是如此重要,就好比是男人就要追漂亮姑娘一樣~~下面就來聊聊Apple官網上的內存管理的事情。

 

Objective-C的對象內存管理是一件非常有意思的事情,由其是在iPhone嵌入式設備中.

 

想玩的省心點,就得熟知它的管理規則,由其是內存的管理機制。了解它的品性了才能在Cocoa的世界里如魚得水。否則,反之(如水得魚!!^_^)。

 

首先,要牢記Apple的官網上的內存管理三定律:

 

1,一個對象可以有一個或多個擁有者

 

2,當它一個擁有都都沒有時,它就會被回收

 

3,如果想保留一個對象不被回收,你就必需成為它的擁有者

 

 

所有內存管理的原則全在這裡!!

 

簡單??哈哈!

 

名人曰:「大道至簡」

 

這兒玩意兒說起來比過家家還容易,但其實有些事情真正做起來並不是簡單的事兒~~

 

咱們首先來說怎麼樣才能成為一個對象的擁有者。Cocoa提供了一個機制叫"reference counting",翻譯過來就是「關聯記數器」(自己翻譯的,真不知叫啥,如果有官方的翻譯請通知我)。每一個對象都有一個關聯記數的值。當它被創建時,它的值為「1」。當值減少到「0」時,就會被回收(調用它的deallocate方法,如果沒有寫,則調用從NSObject繼承而來的回收方法,下文有說,一定要重寫該方法)。以下幾個方法可以操作這個記數:

 

1alloc

   為對象分配內存,記數設為「1」,並返回此對象。

 

2copy

   複製一個對象,此對象記數為「1」,返回此對象。你將成為此克隆對象的擁有者

 

3retain

   對象「關聯記數」加「1」,並成為此對象的擁有者。

 

4release

   對象「關聯記數」減「1」,並丟掉此對象。

 

5autorelease

 

   在未來的某一時刻,對象「關聯記數」減「1」。並在未來的某個時間放棄此對象。

 

有了上面的幾個方法(當然這也是所有的內存操作的方法,簡單吧,哈哈哈)你就可以隨意操作一個對象的記數。並部分或完全的控制它的生命周期。但實際應用中,隨意亂寫上面的任何一個方法都可能會帶來嚴重的內存泄露。混亂的內存分配等於沒完沒了的麻煩工作,你不想在情人節的日子還在為記數之類的鳥問題而丟了老婆吧~~哈哈哈,為了美麗溫柔賢惠又善解人意的准老婆請牢記以下四條:

 

1,一個代碼塊內要確保copy, alloc  retain 的使用數量與 release  autorelease 的數量。

 

2,在使用以「alloc」或「new」開頭或包含「copy」的方法,或「retain」一個對象時,你就會變為它的擁有者。

 

3,實現「dealloc」方法,並施放所有的實例變數。(其實這裡還有很多的巧兒門!!)

 

4,永不自己調用「dealloc」方法,這是系統當「retain」減到「0」時,自動調用的。手動調用會引起retain count記數錯誤(多一次的release)。

 

其實做到這些也不難,

 

retain count 增加與減少的方法對應,板丁板做到了就行了。

 

來自:http://blog.csdn.net/dboylx/archive/2009/02/13/3888746.aspx

 

iphone更改鍵盤右下角按鍵的type

 

UISearchBar為例。

 

 

創建mySearchBar:

 

mySearchBar = [[UISearchBar alloc] initWithFrame:CGRectMake(0.0, 0,320, SEARCH_HEIGHT)];

mySearchBar.placeholder = curPath;

[mySearchBar setDelegate:self];

//tableView.tableHeaderView =mySearchBar;

[self.view addSubview:mySearchBar];

 

 

更改按鍵的keyType(默認是return,這裡將它更改成done,當然還可以更改成其他的):

UITextField *searchField = [[mySearchBar subviews] lastObject];

[searchField setReturnKeyType:UIReturnKeyDone];

[mySearchBar release];

推薦閱讀文章

Bookmark the permalink ,來源:互聯網