2015年5月26日 星期二

[iOS]NSString & EXC_BAD_ACCESS ERROR solution

問題:

使用全域變數NSString *string,使用時候出現exc_BAD_ACCESS???


答案:


@property (nonatomic,retain)NSString *string;

不可以使用assign 要使用retain!


解決!

end

[iOS] Switch Case Error : switch case in protected scope

錯誤代碼:switch case in protected scope

解決方法:

case 1:

{
    code....

}

break;

case 2:

{
   code2....
 
}

break;


解決! end

2015年5月15日 星期五

[iOS] 可展開/收和型的tableView

在找expantable listview,結果找了半天沒有找到,

原來是android叫做listview,ios則是叫做tableview!

這次在.h file完全不用作任何事情,所以就不說.h file了!

原始檔案在這邊:

http://code4app.com/ios/ExpansionTableView/5121cac66803fae949000002

是參考這個弄出來的


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

首先,如果你有開ARC的話,那不需要release/dealloc之類的

第一步:

在viewDidLoad裡面加入

    NSString *path  = [[NSBundle mainBundle] pathForResource:@"ExpansionTableTestData" ofType:@"plist"];//指定要去哪一個檔案名稱,檔案類型找,放進去path裡面

    _dataList = [[NSMutableArray alloc] initWithContentsOfFile:path];


pathForResource這邊是檔案名稱 

ofType則是檔案類型

所以我們要讀取的列表就是ExpansionTableTestData.plist這個檔案


顯然還沒宣告_dataList,所以在前面interface下面就要先宣告一個

NSMutableArray *_dataList;


像這樣

@interface Page3 ()<UITableViewDataSource,UITabBarDelegate>
{
    NSMutableArray *_dataList;
}
@property (assign)BOOL isOpen;
@property (nonatomic,retain) NSIndexPath *selectIndex;
@property (nonatomic,retain) IBOutlet UITableView *expansionTableView;

@end

@implementation Page3
@synthesize isOpen,selectIndex;

紅色部分為新增的


再來就是新增加建構子,

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    return [_dataList count];
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    if (self.isOpen) {
        if (self.selectIndex.section == section) {
            return [[[_dataList objectAtIndex:section] objectForKey:@"list"] count]+1;;
        }
    }
    return 1;
}

//iphone 5以下可以用float,5s~6 plus CGFloat
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    return 40;
}


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (self.isOpen&&self.selectIndex.section == indexPath.section&&indexPath.row!=0) {
        static NSString *CellIdentifier = @"Cell2";
        Cell2 *cell = (Cell2*)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
        
        if (!cell) {
            cell = [[[NSBundle mainBundle] loadNibNamed:CellIdentifier owner:self options:nil] objectAtIndex:0];
        }
        NSArray *list = [[_dataList objectAtIndex:self.selectIndex.section] objectForKey:@"list"];
        cell.titleLabel.text = [list objectAtIndex:indexPath.row-1];
        return cell;
    }else
    {
        static NSString *CellIdentifier = @"Cell1";
        Cell1 *cell = (Cell1*)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
        if (!cell) {
            cell = [[[NSBundle mainBundle] loadNibNamed:CellIdentifier owner:self options:nil] objectAtIndex:0];
        }
        NSString *name = [[_dataList objectAtIndex:indexPath.section] objectForKey:@"name"];
        cell.titleLabel.text = name;
        [cell changeArrowWithUp:([self.selectIndex isEqual:indexPath]?YES:NO)];
        return cell;
    }
}


#pragma mark - Table view delegate
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    //展開items,開始判斷式
    if (indexPath.row == 0) {
        //第一層
        if ([indexPath isEqual:self.selectIndex]) {
            self.isOpen = NO;
            [self didSelectCellRowFirstDo:NO nextDo:NO];//進入下一段函式
            self.selectIndex = nil;
            
        }else
        {
            if (!self.selectIndex) {
                self.selectIndex = indexPath;
                [self didSelectCellRowFirstDo:YES nextDo:NO];
                
            }else
            {
                
                [self didSelectCellRowFirstDo:NO nextDo:YES];
            }
        }
        
    }else
    {
        //第二層
        NSDictionary *dic = [_dataList objectAtIndex:indexPath.section];
        NSArray *list = [dic objectForKey:@"list"];
        NSString *item = [list objectAtIndex:indexPath.row-1];
        //顯示點擊的item
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:item message:nil delegate:nil cancelButtonTitle:@"取消" otherButtonTitles: nil];
        [alert show];//跳出訊息
    }
    [tableView deselectRowAtIndexPath:indexPath animated:YES];
}


- (void)didSelectCellRowFirstDo:(BOOL)firstDoInsert nextDo:(BOOL)nextDoInsert
{
    self.isOpen = firstDoInsert;
    
    Cell1 *cell = (Cell1 *)[self.expansionTableView cellForRowAtIndexPath:self.selectIndex];
    [cell changeArrowWithUp:firstDoInsert];//疑似把箭頭往上?
    
    [self.expansionTableView beginUpdates];
    
    int section = self.selectIndex.section;
    int contentCount = [[[_dataList objectAtIndex:section] objectForKey:@"list"] count];
    NSMutableArray* rowToInsert = [[NSMutableArray alloc] init];
    for (NSUInteger i = 1; i < contentCount + 1; i++) { //第二層有幾行 content count
        NSIndexPath* indexPathToInsert = [NSIndexPath indexPathForRow:i inSection:section];
        [rowToInsert addObject:indexPathToInsert];
    }
    
    if (firstDoInsert)
    {   [self.expansionTableView insertRowsAtIndexPaths:rowToInsert withRowAnimation:UITableViewRowAnimationTop];
    }
    else
    {
        [self.expansionTableView deleteRowsAtIndexPaths:rowToInsert withRowAnimation:UITableViewRowAnimationTop];
    }
    
    //[rowToInsert release];
    
    [self.expansionTableView endUpdates];
    if (nextDoInsert) {
        self.isOpen = YES;
        self.selectIndex = [self.expansionTableView indexPathForSelectedRow];
        [self didSelectCellRowFirstDo:YES nextDo:NO];
    }
    if (self.isOpen) [self.expansionTableView scrollToNearestSelectedRowAtScrollPosition:UITableViewScrollPositionTop animated:YES];
}

然後我們要建構xib檔,拉出一個table view (記得要選autolayer)

然後要與@property (nonatomic,retain) IBOutlet UITableView *expansionTableView;

這一行做連結(滑鼠右鍵拉過去connect)

















然後還要把dataSource/delegate也連結到file's Owner

如果要修改列表的內容,就要去expansiontabletestdata.plist那邊修改喔!

完整檔案在code4app可以下載,這邊就不附上囉!

end

2015年5月11日 星期一

[iOS] 可輸入文字(textfield)之警告視窗(alertview)

又遇到問題,於是找了方法來解決


android上面的alertview十分簡單(custom的部份)

iOS呢?是否一樣簡單?

[ iOS 7 + Xcode 6.3.1 ]


第一次看別人的code:


    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"輸入IP" message:@" " delegate:nil cancelButtonTitle:@"取消" otherButtonTitles:@"確認",nil];
    UITextField * txt = [[UITextField alloc] init];
    txt.backgroundColor = [UIColor whiteColor];
    txt.frame = CGRectMake(alert.center.x+65,alert.center.y+48, 150,23);
    [alert addSubview:txt];

    [alert show];

結果有跳出警告視窗,但是沒有可以輸入的阿!

於是就繼續查,才發現要加上

alert.alertViewStyle = UIAlertViewStylePlainTextInput;


正確版本:

    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"輸入IP" message:@" " delegate:nil cancelButtonTitle:@"取消" otherButtonTitles:@"確認",nil];
    alert.alertViewStyle = UIAlertViewStylePlainTextInput;
    UITextField * txt = [[UITextField alloc] init];
    txt.backgroundColor = [UIColor whiteColor];
    txt.frame = CGRectMake(alert.center.x+65,alert.center.y+48, 150,23);
    [alert addSubview:txt];
    [alert show];

當然style也有password/default(無法顯示)/login..之類的,大家可以自行嘗試喔!

end

2015年5月7日 星期四

[iOS] 改變文字顏色,無效?解決方式

在調整UI的時候常常需要改變顏色

可是使用[UIColor colorwithRed:  green: blue: alpha: ]為什麼輸入數值都沒有反應呢?


錯誤示範:[UIColor colorwithRed: 24 green:116 blue:250  alpha:1 ]

正確示範:[UIColor colorWithRed:24.0f/255.0f green:116.0f/255.0f blue:205.0f/255.0f alpha:1.0f];

需要除以255而且他是float喔!

改完以後就會正確顯示顏色了,簡單但是不知道會弄很久的功能!


end

2015年5月6日 星期三

[iOS] Xcode裡面xib檔內的物件改名後產生NSUnknowkeyException的錯誤解決方法

今天在做ios app的時候又發生了一個悲劇....


看到.h檔裡面的英文拼錯,於是就順手改一下...然後就error!!


找了很久以後,才發現錯誤出現在這邊------



看到Referencing Outlets這邊,

這邊是已經修改過的,如果錯誤的話應該會reference到兩個一個是拼錯字的

另一個才是正確的,我們需要把錯誤的按一下連線的那邊有個x,按下去以後就解除reference

這樣錯誤就修改完成囉!


End