วิธี convert string to int/float, int/float to string ใน Objective C

สมมุติว่า เรามี TextField(Windows เรียก TextBox) อันนึง TagId = 1

แล้วเราต้องการ Convert ไปใส่ในตัวแปล Int หรือ Float

UITextField *txtNumber = (UITextField *)[window viewWithTag:1];
float fNumber;
fNumber = [[txtNumber text] floatValue];

float nNumber;
nNumber = [[txtNumber text] intValue];

และถ้าเราอยาก Convert จาก Int/Float เป็น String ลงใน text field
txtShowF.text = [NSString stringWithFormat:@”%f”, fNumber];
txtShowN.text = [NSString stringWithFormat:@”%n”, nNumber];

 

http://www.im-ai.com/blog/tag/textfield-cocoa/

Advertisements

UITableView

method: Require*

ส่วนแรกคือ numberOfSectionsInTableView: เป็น method ที่ไว้สำหรับระบุว่า ในแต่ละ table นั้นประกอบไปด้วย section กี่อันนั่นเอง ในการแสดงผลของ tableView นั้นมีให้เลือกแสดงได้ 2 แบบด้วยกัน นั่นก็คือ แบบ Plain, Grouped ถ้าเป็นแบบ plain นั้นก็คือแบบตารางทั่ว ๆ ไปแต่เมื่อใดที่เราเลือกแบบ grouped นั้นก็จะแสดงเป็นกรอบแบ่งแยกเป็นหมวดหมู่ให้เราอย่างชัดเจน

– (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {

return 1;

}

ส่วนที่สองคือ numberOfRowsInSection: เป็น method ที่ไว้สำหรับระบุว่า ในแต่ละ section หรือในแต่ละ table นั้นจะมีกี่แถวนั่นเอง ในตอนต้นเราระบุเอาไว้ว่า มี 1 section และใน section นั้นก็มีทั้งหมด [newsTitle count];  ก็แสดงว่า มีจำนวนแถวทั้งหมดเท่ากับ count นั่นเอง

// Customize the number of rows in the table view.

– (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {

return [newsTitle count];

}

ส่วนถัดมาคือ cellForRowAtIndexPath: เป็น method ที่ไว้สำหรับ ใส่ค่าต่าง ๆ เข้าไปใน table หรือเข้าไปในแต่ละแถว ในเบื้องต้น เราจะใส่เพียงแค่ค่าที่จะต้อง  return กลับมาก่อนเท่านั้น ในตอนหน้า จะมีการแสดงผลของ table ในแบบต่าง ๆ ที่จะสามารถแบ่งแยก cell ออกมาได้อีกเช่นกัน

– (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath {

}

ส่วนสุดท้ายคือ didSelectRowAtIndexPath: เป็น method ที่สำหรับ ไว้รับค่าเมื่อมีการกดที่แถวของ table แล้วทำการแสดงผลลัพธ์ หรือไปเรียก view อื่นขึ้นมาก็ได้เช่นกัน หรือแม้กระทั่วแสดงข้อความแจ้ง หรือเปิดหน้าเว็ปไซต์ก็ได้เช่นกัน

– (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{

}

 

Credit : http://iphone.checkyoursites.com/?tag=checkyoursites-com

Parse XML ด้วย NSXMLParser

มี library หลากหลายตัวที่ช่วยให้เราสามารถ parse XML ด้วย Objective-C ได้ ซึ่งคลาสในตระกูล NS* ก็เตรียมNSXMLParser ให้เราได้ใช้อยู่แล้ว

หลักการคร่าวๆของ NSXMLParser จะไม่ใช่การเขียนโปรแกรมวนรอบให้วิ่งไปตาม element ต่างๆที่เจอ แต่จะเป็นการเขียน code เข้าไปแทรกที่จังหวะต่างๆใน delegate method ที่มีให้ ในมุมมองที่ซึ่งตัว parser จะวิ่งไปตาม element ต่างๆให้เราเอง ส่วนเราก็มีหน้าที่วาง code แทรกลงไป ว่าหาก parser วิ่งมาถึงจุดนี้ จะให้มันทำอะไรบ้าง นั่นเอง

สำหรับบันทึกนี้จะเอา code เข้าไปเขียนไว้ในเหตุการณ์ต่างๆดังนี้
เมื่อ parser วิ่งไปเจอ element (เจอ tag เปิด)
เมื่อ parser วิ่งไปเจอ character ระหว่าง element
เมื่อ parser วิ่งออกจาก element (เจอ tag ปิด)
เมื่อ parser วิ่งไปจนจบ document

ทั้ง 4 เหตุการณ์ดังกล่าวจะถูกแทนด้วย delegate method ต่อไปนี้ตามลำดับ

parser:didStartElement:namespaceURI:qualifiedName:attributes:
parser:foundCharacters:
parser:didEndElement:namespaceURI:qualifiedName:
parserDidEndDocument:

ชื่อ method ยาวหน่อย 😉

ครานี้ก็มาถึง code ตัวอย่างการใช้งาน โดยจะใช้ XML ตัวอย่างจาก W3C ไฟล์นี้ โดยเริ่มจากการประกาศตัวแปรต่างเตรียมใช้งานก่อน ซึ่งจากลักษณะของ xml ตัวอย่าง จะได้ตัวแปรต่างๆดังนี้

    /* สำหรับเก็บรายชื่อของ food */
    NSMutableArray *breakfast_menu;
    /* เก็บชื่อของ element ที่ตัว parser วิ่งไปถึง */
    NSString *currentElement
    /* อาหารแต่ละชนิดจะมี property ของตัวเอง เราจึงเลือกใช้ dictionary */
    NSMutableDictionary *currentFood;
    /* เอาไว้เก็บค่าชั่วคราว */
    NSMutableString *currentName, *currentPrice, *currentDescription, *currentCalories;

จากนั้นเริ่มลงมือ โดยการสร้าง instance ของ NSXMLParser ก่อนด้วย xml ตัวอย่างดังกล่าว พร้อมทั้งกำหนด delegate ให้เรียบร้อย ดังนี้

    NSString *path = @”http://www.w3schools.com/XML/simple.xml”;
    breakfast_menu = [[NSMutableArray alloc] init];
    NSURL *xmlURL = [NSURL URLWithString: path];
    parser = [[NSXMLParser alloc] initWithContentsOfURL: xmlURL];
    [parser setDelegate: self];
    NSLog(@”start parsing”);
    [parser parse];

แทรก code เข้าไป เมื่อ parser วิ่งไปเจอ element ใดๆ ในที่นี้จะกำหนดว่าหาก parser วิ่งไปเจอ element ชื่อ food ให้สร้าง object ต่างๆไว้รอเก็บ property ต่างๆของ food ไว้เลย

 – (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict{
    if([elementName isEqualToString: @”food”]){
        currentFood = [[NSMutableDictionary alloc] init];
        currentName = [[NSMutableString alloc] init];
        currentPrice = [[NSMutableString alloc] init];
        currentDescription = [[NSMutableString alloc] init];
        currentCalories = [[NSMutableString alloc] init];
    }
}

และเมื่อ parser วิ่งไปเจอ character ที่อยู่ระหว่าง tag ก็ให้ตรวจสอบดูว่าตอนนี้กำลังอ่านอยู่ใน element ชื่อว่าอะไร จากนั้นให้เอาค่าที่ได้เก็บไว้ในตัวแปรให้ถูกต้อง

– (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{
    if(![[string stringByTrimmingCharactersInSet: [NSCharacterSet whitespaceAndNewlineCharacterSet]] isEqualToString: @””]){
        if([currentElement isEqualToString: @”name”]){
            [currentName appendString: string];
        }else if([currentElement isEqualToString: @”price”]){
            [currentPrice appendString: string];
        }else if([currentElement isEqualToString: @”description”]){
            [currentDescription appendString: string];
        }else if([currentElement isEqualToString: @”calories”]){
            [currentCalories appendString: string];
        }
    }
}

และเมื่อ parser วิ่งไปจนจบ element นั้นๆแล้ว ให้นำค่าที่อ่านได้นำไปเก็บไว้ใน food ที่เป็น dictionary object แต่หากพบว่า parser วิ่งออกจาก element ชื่อ food ให้นำตัวแปร currentFood ไปเก็บไว้ใน list ที่เตรียมไว้ตอนแรก

– (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{
    if([elementName isEqualToString: @”name”]){
        [currentFood setObject: currentName forKey: @”name”];
    }else if([elementName isEqualToString: @”price”]){
        [currentFood setObject: currentPrice forKey: @”price”];
    }else if([elementName isEqualToString: @”description”]){
        [currentFood setObject: currentDescription forKey: @”description”];
    }else if([elementName isEqualToString: @”calories”]){
        [currentFood setObject: currentCalories forKey: @”calories”];
    }else if([elementName isEqualToString: @”food”]){
        [breakfast_menu addObject: currentFood];
    }
}

เมื่อ parser วิ่งไปจนจบ document แล้วให้ลอง print ออกมาดู ดังนี้

– (void)parserDidEndDocument:(NSXMLParser *)parser {
    NSLog(@”all done!”);
    NSLog(@”food list array has %d items”, [breakfast_menu count]);
    NSMutableDictionary *food;
    for(int i = 0; i < [breakfast_menu count]; i ++){
        food = [breakfast_menu objectAtIndex: i];
        NSLog(@”\nname: %@\nprice: %@\ndescription: %@\ncalories: %@\n\n”,
              [food objectForKey: @”name”],
              [food objectForKey: @”price”],
              [food objectForKey: @”description”],
              [food objectForKey: @”calories”]);
    }
}
credit : http://khomkrit.blogspot.com