搜尋此網誌

2012年8月30日 星期四

UITableViewCell重復使用問題


由於發生 列表第一次登入可以產出
但是第二次登入卻無法呈現
才發現原來有這樣問題

解決方式
http://hi.baidu.com/suifeng_89/item/e026b7c2d39f2ab50c0a7b1f


iphone重用机制是苹果为了实现大量数据显示而采用的一种节省内存的机制,比如在UITableView和ScrollView 等地方。为什么要“可重用”???对于我们的项目来说,内存控制是必不可少的,如果一个tableview有几百个cell,这个内存消耗是很大的,而且有些cell里面都有image之类的很占内存的资源存在的话,那这样很容易出现memory warning甚至crash掉,这不是我们想要看到的。对此,tableview实现了它自己的管理方法dequeueReusableCellWithIdentifier(ps:我们在某些项目中scrollview来显示很多张image,在scrollview滑动中也要这样处理,来避免内存的过度消耗,只不过tableview它已经实现了这个方法,而不用我们自己去写)。
但是在实际使用过程中,会有以下问题:

ios 内存使用陷阱


ios 内存使用陷阱

在iphone开发过程中,代码中的内存泄露我们很容易用内存检测工具leaks 检测出来,并一一改之,但有些是因为ios 的缺陷和用法上的错误,leaks 检测工具并不能检测出来,你只会看到大量的内存被使用,最后收到didReceiveMemoryWarning,最终导致程序崩溃。以下是开发过程中遇到的一些问题和网上的一些资料,总结了一下:

一、[UIImage imageNamed:]只适合与UI界面中的贴图的读取,较大的资源文件应该尽量避免使用
用UIImage加载本地图像最常用的是下面三种:
1.用imageNamed方法
[UIImage imageNamed:ImageName];
2.用 imageWithContentsOfFile 方法
NSString *thumbnailFile = [NSString stringWithFormat:@"%@/%@.png", [[NSBundle mainBundle] resourcePath], fileName];
UIImage *thumbnail = [UIImage imageWithContentsOfFile:thumbnailFile];
3. 用initWithContentsFile方法
UIImage *image = [[UIImage alloc] initWithContentsOfFile:filePath]

2012年8月29日 星期三

對 Document 中的檔案存取方法


轉貼:http://furnacedigital.blogspot.tw/2012/03/document.html

對 Document 中的檔案存取方法

  

每個應用程式裡都有一個 Document 資料夾,內容通常存放一些動態的使用者資料,與一般暫存區不同的是 Document 資料夾中的檔案在結束應用程式之後,仍然會保留,因此你可以將一些應用程式的環境設定參數存入其中,以便在下一次執行應用程式時做環境上的設定。下面將以 plist(Property List)檔案為例,實作讀取、寫入、清除等動作。


監控UITextField變化 Listen for UItextfield change


- (void)viewDidLoad {
[textlabel addTarget:self action:@selector(onTextFieldDidChange) forControlEvents:UIControlEventEditingChanged];
}
-(void)onTextFieldDidChange {
NSLog(@”input = %@”,textlabel.text);
}

UITextField控件的属性


iOS开发3:UITextField控件的属性

3人收藏此文章, 我要收藏发表于6个月前(2012-03-02 16:38) , 已有2007次阅读 共2个评论
在 Xcode 4.2 中使用 IB 给视图拖上去一个文本框后,选中文本框,可以在Attribute Inspector中设置其各种属性。
Attribute Inspector 分为三部分,分别是 Text Field、Control 和 View 部分。我们重点看看 Text Field 部分。
Text Field 部分有以下选项:
1、Text :设置文本框的默认文本。
2、Placeholder : 可以在文本框中显示灰色的字,用于提示用户应该在这个文本框输入什么内容。当这个文本框中输入了数据时,用于提示的灰色的字将会自动消失。
3、Background :
4、Disabled : 若选中此项,用户将不能更改文本框内容。
5、接下来是三个按钮,用来设置对齐方式。
6、Border Style : 选择边界风格。
7、Clear Button : 这是一个下拉菜单,你可以选择清除按钮什么时候出现,所谓清除按钮就是出一个现在文本框右边的小 X ,你可以有以下选择:
    7.1 Never appears : 从不出现
    7.2 Appears while editing : 编辑时出现
    7.3 Appears unless editing : 
    7.4 Is always visible : 总是可见
8、Clear when editing begins : 若选中此项,则当开始编辑这个文本框时,文本框中之前的内容会被清除掉。比如,你现在这个文本框 A 中输入了 "What" ,之后去编辑文本框 B,若再回来编辑文本框 A ,则其中的 "What" 会被立即清除。
9、Text Color : 设置文本框中文本的颜色。
10、Font : 设置文本的字体与字号。
11、Min Font Size : 设置文本框可以显示的最小字体(不过我感觉没什么用)
12、Adjust To Fit : 指定当文本框尺寸减小时,文本框中的文本是否也要缩小。选择它,可以使得全部文本都可见,即使文本很长。但是这个选项要跟 Min Font Size 配合使用,文本再缩小,也不会小于设定的 Min Font Size 。
接下来的部分用于设置键盘如何显示。
13、Captitalization : 设置大写。下拉菜单中有四个选项:
    13.1 None : 不设置大写
    13.2 Words : 每个单词首字母大写,这里的单词指的是以空格分开的字符串
    13.3 Sentances : 每个句子的第一个字母大写,这里的句子是以句号加空格分开的字符串
    13.4 All Characters : 所以字母大写
14、Correction : 检查拼写,默认是 YES 。
15、Keyboard : 选择键盘类型,比如全数字、字母和数字等。
16、Appearance:
17、Return Key : 选择返回键,可以选择 Search 、 Return 、 Done 等。
18、Auto-enable Return Key : 如选择此项,则只有至少在文本框输入一个字符后键盘的返回键才有效。
19、Secure : 当你的文本框用作密码输入框时,可以选择这个选项,此时,字符显示为星号。

在兩個view之間傳遞參數方法之一


在兩個view之間傳遞參數方法之一
loginViewController.m


                    NSNotification *notification = [NSNotification notificationWithName:@"LoginNotify" object:nil userInfo:[NSDictionary dictionaryWithObject:account.text forKey:@"account"]];
                    
                    [[NSNotificationQueue defaultQueue]
                     enqueueNotification:notification
                     postingStyle:NSPostWhenIdle
                     coalesceMask:NSNotificationCoalescingOnName
                     forModes:nil];
                    
                    [activityView stopAnimating];
                    [self performSegueWithIdentifier:@"LoginSegue" sender:nil];




loginexeViewController.m





[[NSNotificationCenter defaultCenter] addObserverForName:@"LoginNotify" object:nil queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification *notification){
        NSDictionary *dict = notification.userInfo;
        NSLog(@"你的帳號:%@",[dict objectForKey:@"name"]);
    }];

read write plist 存讀取plist


read write plist 存讀取plist

//讀檔

- (void)readPlist
{
//取得檔案路徑
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *filePath = [documentsDirectory stringByAppendingString:@"/data.plist"];
//
NSFileManager *fileManager = [NSFileManager defaultManager];
NSMutableDictionary *plistDict;
if ([fileManager fileExistsAtPath: filePath]) //檢查檔案是否存在
{
plistDict = [[NSMutableDictionary alloc] initWithContentsOfFile:filePath];
}else{
plistDict = [[NSMutableDictionary alloc] init];
}
NSString *value;
value = [plistDict objectForKey:@"version"];

[plistDict release];

}

//================================================================
//存檔

//存檔
- (void)writePlist
{
//取得檔案路徑
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *filePath = [documentsDirectory stringByAppendingString:@"/data.plist"];

//
NSFileManager *fileManager = [NSFileManager defaultManager];
NSMutableDictionary *plistDict;
if ([fileManager fileExistsAtPath: filePath]) //檢查檔案是否存在
{
plistDict = [[NSMutableDictionary alloc] initWithContentsOfFile:filePath];
}else{
plistDict = [[NSMutableDictionary alloc] init];
}


[plistDict setValue:@"1.0.0" forKey:@"version"];

//存檔
if ([plistDict writeToFile:filePath atomically: YES]) {
NSLog(@"writePlist success");
} else {
NSLog(@"writePlist fail");
}
[plistDict release];

}

//================================================================
注意事項
1.未存過的檔案的第一次建構
2.檔案的路徑


Objective-C中的字符串比較


Objective-C中的字符串比较

还是对Objective-C欠熟悉,一个很简单的字符串比较,想当然的按照C++ string的方式来处理,结果debug了好半天得不到正确的结果,Google之后才想起来原来是这么回事。
Objective-C中,NSString的==操作符比较的是字符串地址,不是字符串内容,如果需要比较内容则需要使用isEqualToString:方法。具体的介绍可以看这里:http://iphonedevelopertips.com/cocoa/compare-nsstrings-objects.html 但是Xcode会对部分字符串做优化,相同的字符串会使用同一份拷贝,所以有时候也会出现意想不到的“正确”结果,比如:

这段代码会打印出 str1 equals str2,但是这样就不会:


另外,正确的字符串内容比较方法为:



加强学习!
原创文章,转载请注明: 转载自All-iPad.net

2012年8月28日 星期二

客制化UITableViewCell


CustomerCell.h
#import <UIKit/UIKit.h>

@interface CustomerCell : UITableViewCell
@property (strong, nonatomic) IBOutlet UIImageView *filmImageView;
@property (strong, nonatomic) IBOutlet UILabel *filmNameLabel;
@property (strong, nonatomic) IBOutlet UILabel *instructorLabel;
@property (strong, nonatomic) IBOutlet UILabel *pointLabel;

@end

.m不變

2012年8月22日 星期三

UITableViewCell圖片固定大小

 float sw=50/cell.imageView.image.size.width;
  float sh=50/cell.imageView.image.size.height;
  cell.imageView.transform=CGAffineTransformMakeScale(sw,sh);

xcode 自動排版


Xcode  版本:4.2和4.2之前的版本
             选中需要格式化代码 -> Edit -> Format ->Re-Indent
Xcode 版本:4.2之后的版本
             选中需要格式化代码 -> Editor -> Structure ->Re-Indent       或者
             选中需要格式化代码 -> 右击 ->选中 Structure ->Re-Indent

2012年8月7日 星期二

(IOS)AFNetworking 非同步network處理



介绍:
    AFNetworking是一个轻量级的iOS网络通信类库。它建立在NSURLConnection和NSOperation等类库的基础上,让很多网络通信功能的实现变得十分简单。它支持HTTP请求和基于REST的网络服务(包括GET、POST、 PUT、DELETE等)。支持ARC。

代码文档查看网站:http://afnetworking.org/Documentation/ 


https://github.com/AFNetworking/AFNetworking

圖片預載

//此處改為用AFNetworking
        NSURL *url = [[NSURL alloc] initWithString:[[videoList objectAtIndex:indexPath.row] objectForKey:@"filmImage"]];
        [cell.imageView setImageWithURL:url placeholderImage:[UIImage imageNamed:@"placeholder"]];

後面的placeholder是代表如果圖還沒下來前要出現的圖片名


(IOS)switch view


在使用storyborad的情況下

- (IBAction)go2:(id)sender {
   
       UIViewController *controller =[self.storyboard instantiateViewControllerWithIdentifier:@"filmView"];
        [self presentModalViewController:controller animated:YES];
    
}


- (IBAction)back1:(id)sender {
    
    [self dismissModalViewControllerAnimated:YES];
 }


2012年8月6日 星期一

(IOS)Tapku Library


Tapku 是一個開源的程式庫,包含10種有用的 API,而且在使用上也十分容易。
1.Coverflow
就是做出類似 iPhone Music 顯示唱片 Cover 的效果。
2.Month Grid Calendar