NJ 學習點滴積累

1.ios中app設置的添加

http://blog.csdn.net/bihailantian1988/article/details/8332972

利用新建setting bundle 實現


2. 阻止iOS設備鎖屏

http://www.2cto.com/kf/201111/109789.html

[UIApplication shareApplication] setIdleTimerDisabled:YES];


3.兩個view 交換位置

a.最原始的一種,用addview、和removefromsuperview 進行修改

  self.firstView = [[UIViewalloc]initWithFrame:CGRectMake(0,100,200,200)];

    _firstView.backgroundColor = [UIColoryellowColor];

    UILabel *textlabel = [[UILabelalloc]initWithFrame:CGRectMake(0,100,200,40)];

    textlabel.text = @"這是第一個Firstview";

    [_firstView addSubview:textlabel];

    UIButton *btn1 = [UIButtonbuttonWithType:UIButtonTypeCustom];

    btn1.frame = CGRectMake(0,0,80,60) ;

    [btn1 setTitle:@"進入"forState:UIControlStateNormal];

    [btn1 addTarget:selfaction:@selector(jumpinto:)forControlEvents:UIControlEventTouchUpInside];

    [btn1 setBackgroundColor:[UIColorblueColor]];

    [_firstView addSubview:btn1];


    self.secondView = [[UIViewalloc]initWithFrame:CGRectMake(0,100,200,200)];

    _secondView.backgroundColor = [UIColorredColor];

    UILabel *textlabel1 = [[UILabelalloc]initWithFrame:CGRectMake(0,100,200,40)];

    textlabel1.text = @"這是第二個Secondview";

    [_secondView addSubview:textlabel1];

    UIButton *btn2 = [UIButtonbuttonWithType:UIButtonTypeCustom];

    btn2.frame = CGRectMake(0,20,80,60) ;

    btn2.backgroundColor = [UIColorblueColor];

    [btn2 setTitle:@"返回"forState:UIControlStateNormal];

    [btn2 addTarget:selfaction:@selector(back:)forControlEvents:UIControlEventTouchUpInside];

    [_secondView addSubview:btn2];

//添加第一個view

        [self.view addSubview:_firstView];

}

//加上第二個view 以覆蓋第一個

-(void)jumpinto:(id)sender

{

       [self.view addSubview:_secondView];

}

//移除第二個view,顯示第一個

-(void)back:(id)sender

{

    [self.secondViewremoveFromSuperview];

    NSLog(@"self.secondView = %@",self.secondView);

}

b.用Uivew 自帶的方法

  [UIViewtransitionFromView:self.secondViewtoView:self.firstViewduration:0.5 

       options:UIViewAnimationOptionTransitionFlipFromLeftcompletion:^(BOOL finished) {

        

    }];


4.兩個控制器間的傳值

a.屬性傳值

b.代理傳值  (注意 設置代理的對象有無發生改變)

c. block 傳值

d.通知傳值

e.單例傳值

5. 對於oxFF & i,i爲一個int類型的數

http://jingyan.baidu.com/article/215817f7d6f9881eda1423f9.html

6.對於uitableview 的滑動刪除步驟

a. 

//先要設Cell可編輯

- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath

{

    return YES;

}


- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath

{

    returnUITableViewCellEditingStyleDelete;

}


//修改編輯按鈕文字

- (NSString *)tableView:(UITableView *)tableView titleForDeleteConfirmationButtonForRowAtIndexPath:(NSIndexPath *)indexPath

{

    return @"刪除";

}


- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath

{

    if (editingStyle ==UITableViewCellEditingStyleDelete)

    {

        _currentSelectIndexpath = indexPath;

        UIAlertView *alertView = [[UIAlertViewalloc]initWithTitle:nilmessage:@"確定刪除該聯繫人的通話記錄" delegate:selfcancelButtonTitle:@"取消"otherButtonTitles:@"確定",nil];

        [alertView show];

    }

}

#pragma mark - UIAlertViewDelegate

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex

{

1.刪除數據庫

2.刪除_dataArray中數據

3.刪除row 

[self.detailTableViewdeleteRowsAtIndexPaths:[NSArrayarrayWithObject:_currentSelectIndexpath]withRowAnimation:UITableViewRowAnimationLeft];

4.刷新tableview

}


7. 對於storyboard約束常見錯誤

http://www.cocoachina.com/applenews/devnews/2013/1203/7462.html

注意T-bars仍然是橘黃色的。這意味這你的佈局沒有完成;自動佈局沒有足夠的約束條件計算出視圖的位置和大小。解決辦法便是增加更多約束,直到他們變藍。

a.約束條件不全  (比如只有上約束+寬高 ,無法確定 控件的位置)

b. 約束出錯 (約束的數值有錯、多次約束同一個)


8. 對於uitableview 的cell自定義

在繪製cell的時候,展示數據放到CustomCell中去,不要放到cellForRowAtIndexPath方法中,

  1. - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath  
{

CustomCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

[cell  setupCellWithModel:contactinfo Model類      indexPath:indexPath];

return cell;

}

9. 對於一些通知名,常量的定義最好放到一個專門的#define 文件中,利於管理

#define kTestPhoneNumber @"11230801178"


10. 對於模擬器調試,定義一個宏

http://www.2cto.com/kf/201309/243211.html

#define USE_TEST 1

//調試模式

#if DEBUG

#if USE_TEST

    [[COCall sharddialSuccess];

#else

#endif


#else

#endif

11. 對於數據庫DB的操作,最好放到一個單例類中,讓所有數據庫操作的入口都從這個單例中進,容易控制


12.給uitableview 設置長按手勢

  UILongPressGestureRecognizer *longPressGr = [[UILongPressGestureRecognizeralloc]initWithTarget:selfaction:@selector(longPressCell:)];

        longPressGr.minimumPressDuration = 1;

        [self.tableViewaddGestureRecognizer:longPressGr];

#pragma mark - Gesture

- (void)longPressCell:(UILongPressGestureRecognizer *)gesture

{

    if (gesture.state ==UIGestureRecognizerStateBegan)

    {

        CGPoint point = [gesture locationInView:self.tableView];

        NSIndexPath *indexPath = [self.tableViewindexPathForRowAtPoint:point];

        if (indexPath == nil)

        {

            return;

        }

        else

        {

            //長按彈框

        }

    }

}


13. 對於一些基本的UI 操作儘量封裝,如:navigationBar、statusBar隱藏之類的,

- (void)hideNavigationBarWithAnimation

{

//隱藏、animation動畫操作

}


14. 一般的UITabbar的代理UITabBarControllerDelegate

設置代理

   self.tabBarController.delegate =self;

    self.navigationController.delegate =self;

- (BOOL)tabBarController:(UITabBarController *)tabBarController shouldSelectViewController:(UIViewController *)viewControlle

- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController

15. navigationbar 的代理方法

- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated


16. 對於Segue的使用

a.在storyboard上面連線,給Storyboard Segue  Identifier:SegueName 

b. 在對應VC裏的代碼

- (void)searchBtnPress:(id)sender

{

    [selfperformSegueWithIdentifier:ContactsPushSearchSeguesender:nil];

}

sender爲跳轉的控件:UIButton、UITableViewCell

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender

{

    if ([segue.identifierisEqualToString:ContactsPublicInfoSegue])

    {

        ContactsInfoViewController *info = segue.destinationViewController;

//傳遞數據

        info.contactType =ContactsInfoTypePublic;

    }

    elseif ([segue.identifierisEqualToString:ContactsPushPublicSearchSegue])

    {

        ContactSearchVC *sv = segue.destinationViewController;

    }

}


15. uitableview右側索引

http://poolo.iteye.com/blog/1704922

設置sectionIndex

-(NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView;

此時是默認對應 順序對應 sectionIndex根據順序對應 到section

 

修改sectionIndex對應

- (NSInteger)tableView:(UITableView *)tableView sectionForSectionIndexTitle:(NSString *)title atIndex:(NSInteger)index{

通過傳入的傳入每個sectionIndex的title,index 來設置這個sectionIndex 對應的section。


16.對於uitableviewcell 設置滑動的位置

setContentOffset

[self.tableViewsetContentOffset:CGPointMake(0,localContent)];


17.  UITextField的代理方法  UITextfieldDelgate

- (void)textFieldDidBeginEditing:(UITextField *)textField; 

- (void)textFieldDidEndEditing:(UITextField *)textField;


18.uilabel的尺寸frame根據文本內容進行計算

 CGSize ansize = [answerLabel.textsizeWithFont:[UIFontsystemFontOfSize:15]constrainedToSize:CGSizeMake(280,MAXFLOAT)lineBreakMode:NSLineBreakByWordWrapping];

answerLabel.frame = CGRectMake(0,0,固定寬,ansize.height)


19 .對於延遲加載問題

a.

單利GlobalData中    .h 文件中屬性NSArray *students;

- (void)reloadStudentData; //供外部使用



在 "GlobalData.m" 中

BOOL isLoadStudentsData;  //標誌是否加載過數據(如果沒有變化,整個app 只要加載一次)

NSArray * StudentDataInside;   //內部使用

- (NSArray *) students

{

if(isLoadStudentData){

return StudentDataInside;

}else{

[StudentDataInside removeAllObjects];

//方法獲取數據 StudentData

[   方法調用  ];

改變標誌位

isLoadStudentData = YES;  //說明加載過

return  studentDataInside;

}

}


//當需要刷新數據時候

- (void)reloadStudentData

{

改變標誌位

isLoadStudentData = NO;  //說明加載過

[studentDataInside removeAllObjects];

}


b.當數據改變時候,要刷新某個界面時候,(判斷當前界面時候是要刷新的界面,if YES,刷新; if NO , 給個刷新標誌,當目標界面載入的時候再去刷新)

通知調用的方法

BOOL isViewShow;  //當前界面標誌


[NSNotificationCenter  DefaultCenter] addObserver : selector :  name:  ];

- (void)viewWillAppear

{

self.isViewShow = YES;

if(_isRefrshSearchResult){

//刷新操作

}

}

- (void)loadDataDone

{

if(isViewShow ){

//刷新操作

}else{

_isRefrshSearchResult = YES;

}

}


20. 對於多次點擊只執行最後一次操作

http://blog.csdn.net/fengsh998/article/details/11112885

//取消延遲時間之前的操作

  [NSObjectcancelPreviousPerformRequestsWithTarget:self];

   [selfperformSelector:@selector(searchDelay:)withObject:text afterDelay:kDelayTime];


21. 對於線程:NSObject、NSThread、NSOperationQueue、GCD區別

如果想取消已經執行的線程:NSThread、NSopeartionQueue的cancel方法,只能立馬改變這個線程的標誌位([NSThread currentThread].isCancel)屬性,並不能立即取消到線程的操作;所以要在線程的操作中加上標誌位判斷來強制儘快的結束掉線程

對於多個線程共享資源的爭奪問題:

記得加上同步鎖/、atomic原子屬性

NSThr



22.友盟統計

http://dev.umeng.com/analytics/ios/quick-start

23. sqlite 的觸發器使用

/*

當T_EC_ADDR 中的name一列進行update 操作,就會觸發執行)update T_EC_ADDR set IS_NAME_CHANGE = 1 where NAME = new.NAME and new.NAME != old.NAME; 

一個事件的產生影響了另一個事件執行

*/

CREATE TRIGGER nameChangeTrigger AFTER update of NAME ON T_EC_ADDR 

BEGIN

  update T_EC_ADDR set IS_NAME_CHANGE = 1 where NAME = new.NAME and new.NAME != old.NAME; 

end

24. 








發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章