iOS 7에서 드디어! 추가된 기능들

본문의 글은 DoubleEncore의 iOS7 Additions:OMG Finally! 를 참고하여 작성되었습니다. (This article is refer to iOS 7 Additions: OMG Finally! at DoubleEncore)   iOS7이 발표된지도 꽤 많은 시간이 지났습니다만 이제서야 review를 하네요… 바로 본문으로 들어갈게요. 1. Support Attachments at Message UI Framework. 개발 시 앱 내에서 iMessage 기능을 편하게 사용하기 위해서 MFMessageComposeViewController를 사용해왔을 것입니다. 이 클래스의 약점 중 하나는 code-level에서 첨부 파일을 넣을 수 없다는 것이였죠. – (BOOL)addAttachmentData:(NSData *)attachmentData typeIdentifier:(NSString *)uti filename:(NSString *)filename; – (BOOL)addAttachmentURL:(NSURL *)attachmentURL withAlternateFilename:(NSString *)alternateFilename; 위 두 메소드가 추가되며 드디어 메시지에 첨부파일을 첨부할 수 있게 되었습니다. Data의 경우 MobileCoreService Framework에 포함된 UTCoreTypes에 정의된 파일형식이라면 대부분 가능한 것 같습니다. 단, 용량제한이나 기타 제한에 대해서는 충분하게 테스트해보지 않았으니 참고하세요. 2. MPVolumeView in Media Player Framework MPVolumeView는 단말의 볼륨을 조절하는 슬라이더와 라우팅할 오디오 소스를 선택할 수 있도록 해주었습니다만 AirPlay system의 정보를 얻기에는 부족함이 있었습니다. @property areWirlessRoutesAvailable; @property isWirelessRouteActive; NSString *const MPVolumeViewWirelessRoutesAvailableDidChangeNotification; NSString *const MPVolumeViewWirelessRoutesActiveDidChangeNotification; 하지만 iOS 7부터 위 코드처럼 두 개의…

iOS7에서 UITableViewCell의 AccessoryView에 버튼을 배치하고 버튼의 selector에서 cell을 참조하기

아래와 같이 특정 서비스에서 친구를 초대하거나 follow할 때 주로 쓰는 UI화면이 있다. UITableView에 UITableViewCell 혹은 이를 상속받는 클래스 구조인데, 여기서 Invite 버튼을 터치했을 때 버튼이 속하는 NSIndexPath를 받기 위해 아래와 같이 코딩을 할 때가 있다. /* UITableView의 data source 메소드 중 cellForRowAtIndexPath: 메소드 */ – (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *CellIdentifier = @"Cell"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; if (!cell) { UIButton *inviteButton = [UIButton buttonWithType:UIButtonTypeRoundedRect]; /* 프로퍼티 정의는 생략 */ [inviteButton addTarget:self action:@selector(onInvite:) forControlEvents:UIControlEventTouchUpInside]; cell.accessoryView = inviteButton; } return cell; } /* Invite 버튼의 selector 메소드 */ – (void)onInvite:(id)sender { if ([sender isKindOfClass:[UIButton class]]) { UIButton *inviteButton = (UIButton *)sender; UITableViewCell *selectedCell = (UITableViewCell *)[inviteButton superview]; NSIndexPath *indexPath = [_tableView indexPathForCell:selectedCell]; NSLog(@"selected row is :%d", indexPath.row); } } 이 경우 onInvite: 메소드의 [inviteButton superview] 가 iOS7 미만에서는 포인터를 가져오는데 문제가 없었지만 iOS7 부터는 문제가 된다. view의 구조를 봤을 때 Invite 버튼은 UITableViewCell의 accesoryView로 대치되었기 때문에 superview는…