objective c [ios] : หาความสูงรวมของ content ใน scroll view

นั่งงงกับปัญหานี้นานมาก 
เพราะใช้วิธีวนลูป subview ของ scrollview เพื่อหาความสูงรวม 
ดันไปเจอไอสอง subview ลับของมัน

โชคดีที่ subview ของ scroll view ไม่มี uiimage
เลยใช้ [view isKindOfClass:[UIImageView class]]  เช็คเอา[view isKindOfClass:[UIImageView class]]

http://wiresareobsolete.com/wordpress/2010/03/uiscrollview-has-a-secret/

 

 

Advertisements

Cache ใช้งานง่ายสำหรับ objective c (ios)

กำลังหัดเขียน ios app

ไปเจอส่วนที่จะใช้ cache เลยเอามาแปะไว้ใน blog

https://github.com/FTW/FTWCache

มีฟังก์ชั่นหลักๆอยู่แค่ 3-4 อัน

setObject สำหรับเก็บ NSData ลง cache โดยผูกไว้กับ key
objectForKey ก็ดึง object มาจาก cache โดยใช้ key
resetCache

 

ตัวอย่าง
สมมติเรามี url ของ image ที่เราจะแสดงอยู่แล้ว เราอาจใช้ MD5Hash ของ url นั้นเป็น key

NSString *key = [imageURL.absoluteString MD5Hash];
NSData *data = [FTWCache objectForKey:key]; //ลองเอา key ไปหาก่อน
if (data) { //ถ้ามีก็ใช้รูปจาก cache
UIImage *image = [UIImage imageWithData:data];
cell.imageView.image = image;
} else { //ถ้าไม่มีก็ไปดึงจาก web

NSData *data = [NSData dataWithContentsOfURL:imageURL]; //ไปดึง data มาจาก webservice
[FTWCache setObject:data forKey:key]; //เก็บลง cache
UIImage *image = [UIImage imageWithData:data];
[tableView cellForRowAtIndexPath:indexPath].imageView.image = image;
}

โค้ดตัวอย่างข้างบนเอามาจาก http://khanlou.com/2012/08/asynchronous-downloaded-images-with-caching/

วิธีใช้ NSUserDefaults

สำหรับคนที่กำลังหัดเขียนแอพ ios

มันมีวิธีเก็บข้อมูลในเครื่องอยู่ 4 วิธี คือ

  1. NSUserDefaults  ง่ายสุด เหมาะกับเก็บอะไรเล็กๆ สำหรับแอพที่ไม่ซับซ้อนมาก รู้สึกแรกว่าเริ่มเดิมทีมันเอาไว้เก็บ user setting  ไปๆมาๆใช้เก็บไปเรื่อย =_=
  2. property files (plist / XML)
  3. SQLLite  มันคือ relational database นั่นละ
  4. Core Data  framework ของ apple  ไม่รู้ ยังไม่ได้ดู

วันนี้จะมาโน้ตเรื่อง NSUserDefaults เฉยๆ เพราะกำลังลองใช้อยู่

วิธีเก็บค่า

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setObject:@”myfistname” forKey:@”firstName”];
[defaults synchronize];

วิธีดึงค่า

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSString *firstName = [defaults objectForKey:@”firstName”];
NSLog(@”%@”,firstName);

 

object ที่เก็บใน NSUserDefaults จะถูกแปลงให้เป็นพวก  immutable เพราะงั้นเวลาเก็บพวก NSMutableArray แล้วจะดึงค่าออกมาใช้ ต้องทำประมาณนี้

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSMutableArray *followingList = [[NSMutableArray alloc] initWithArray:[defaults objectForKey:@”followingList”]];

[iOS] NSInternalInconsistencyException, reason: request for rect at invalid index path

This error means that the application cannot retrieve cell for the specified indexPath — I think there are many things that can cause this but for my case, I just forget to modify

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView

in datasource to have it returns actual number of section in the table (It is 0 by default)

Note : datasource for the table is usually the ViewController itself