由于自动调整scrollView,应用程序崩溃?

时间:2013-10-29 07:01:08

标签: ios

我有一个添加提醒的屏幕。屏幕有2个文本字段和1个textview。这些都在scrollView下,它是TPAvoidingScrollView类的子类。这个类本身管理scrollView的位置,因此键盘出现和消失时内部组件。

屏幕如下。

enter image description here

在我浏览了所有字段并选择了某些值之后。通过单击添加提醒,事件将添加到主日历中,屏幕将弹出到上一个屏幕。然后问题开始发生。只要我再次访问此屏幕并点击Textview Notes,应用程序就会因这些错误而崩溃。

enter image description here enter image description here

此处提醒视图控制器是类的名称 整个班级的代码是:

            #import "ReminderViewController.h"
    #import <EventKit/EventKit.h>
    #import "ActionSheetPicker.h"
    #import "NSDate-Utilities.h"

   @interface ReminderViewController ()

    @end

         @implementation ReminderViewController
        @synthesize scrollView;
        @synthesize  txt_notes;
      @synthesize txt_remindOn;
       @synthesize txt_repeatAlarm;
       @synthesize btn_appointment;
       @synthesize btn_pickup;
       @synthesize btn_reminder;
       @synthesize txt_currentFocussedTextField;
        @synthesize selectedDate;
        @synthesize arr_repeatAlarm;
       @synthesize selectedIndex;
       @synthesize isSelected;
        @synthesize str_eventTitle;

     -      (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
       { 
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
     if (self) {
    // Custom initialization
    }
     return self;
  }

  - (void)viewDidLoad
  {
[super viewDidLoad];
self.scrollView.contentSize = CGSizeMake(320, 520);
self.selectedDate = [NSDate date];
self.arr_repeatAlarm = [NSArray arrayWithObjects:@"None",@"Every Day", @"Every Week", 
   @"Every Month", @"Every year", nil];
btn_reminder.backgroundColor =[UIColor colorWithRed:0.0/255 green:89.0/255 blue:178.0/255
  alpha:1.0f];
[[AppDelegate sharedInstance] setUpHighlightedStateOfButton:btn_reminder];

// Do any additional setup after loading the view.
  }


   #pragma mark - Check button click methods

  -(IBAction)btn_appointment_click:(id)sender{
if(btn_appointment.selected){

    [btn_appointment setSelected:NO];
    [btn_pickup setSelected:YES];
    isSelected = NO;
}
else{

    [btn_appointment setSelected:YES];
    [btn_pickup setSelected:NO];
    isSelected = YES;

  }
 }

  -(IBAction)btn_pickup_click:(id)sender{
if(btn_pickup.selected){

    [btn_pickup setSelected:NO];
    [btn_appointment setSelected:YES];
    isSelected = NO;
}
else{

    [btn_pickup setSelected:YES];
    [btn_appointment setSelected:NO];
    isSelected = YES;

   }
  }



     #pragma mark - calendar Event methods
    - (IBAction)btn_reminder_click:(id)sender{

    [self addEventTocalendar:sender];
  }

     - (void)addEventTocalendar:(id)sender{
EKEventStore *store = [[EKEventStore alloc] init];
[store requestAccessToEntityType:EKEntityTypeEvent completion:^(BOOL granted, NSError
  *error) {
    if (!granted) { return; }
    EKEvent *event = [EKEvent eventWithEventStore:store];
    event.title  = @"Pickup Reminder";


    event.startDate = self.selectedDate;
    event.endDate = [event.startDate dateByAddingTimeInterval:60*60];//set 1 hour meeting
    event.notes = txt_notes.text;
    event.recurrenceRules = EKRecurrenceFrequencyDaily;
    [event addAlarm:[EKAlarm alarmWithRelativeOffset:60.0f * -5.0f]];
    if (selectedIndex == 1) {
        [event addRecurrenceRule:[[EKRecurrenceRule 
  alloc]initRecurrenceWithFrequency:EKRecurrenceFrequencyDaily interval:1 end:Nil]];

    }
    else if (selectedIndex == 2){
        [event addRecurrenceRule:[[EKRecurrenceRule 
     alloc]initRecurrenceWithFrequency:EKRecurrenceFrequencyWeekly interval:1 end:Nil]];
    }
    else if (selectedIndex == 3){
        [event addRecurrenceRule:[[EKRecurrenceRule 
     alloc]initRecurrenceWithFrequency:EKRecurrenceFrequencyMonthly interval:1 end:Nil]];
    }
    else if (selectedIndex == 4){
        [event addRecurrenceRule:[[EKRecurrenceRule 
    alloc]initRecurrenceWithFrequency:EKRecurrenceFrequencyYearly interval:1 end:Nil]];
    }
    [event setCalendar:[store defaultCalendarForNewEvents]];
    NSError *err = nil;
    [store saveEvent:event span:EKSpanThisEvent commit:YES error:&err];
    NSString *savedEventId = event.eventIdentifier;  //this is so you can access this 
    event later
    BOOL isSuceess=[store saveEvent:event span:EKSpanThisEvent error:&err];
    // This needs to be done as the UIKIT was getting called from the seconadary thread 
    and therefore to show the alert view in the main thread and to prevent the hanging of
      the app I have to call the Aletview method in the main thread.
    // i.e dispatch the event in the main thread

    if(isSuceess){
        UIAlertView *alertview = [[UIAlertView alloc] initWithTitle:@"Event" 
       message:@"Event added in calendar" delegate:self cancelButtonTitle:@"OK"
       otherButtonTitles:nil];
        dispatch_async(dispatch_get_main_queue(), ^{
            [alertview show];

        });
    }
    else {
        UIAlertView *alertview = [[UIAlertView alloc] initWithTitle:@"Event" message:[err
       description] delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
        dispatch_async(dispatch_get_main_queue(), ^{
            [alertview show];
        });
    }
}];

}
   - (void)back{
        [self.navigationController popViewControllerAnimated:YES];
    }
   #pragma mark - UIAlertViewDelegate methods
 - (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex{
[self.navigationController popViewControllerAnimated:YES];
  }

    #pragma mark - Implementation methods

 - (void)serviceWasSelected:(NSNumber *)selectedIndex element:(id)element {

self.selectedIndex = [selectedIndex intValue];
//may have originated from textField or barButtonItem, use an IBOutlet instead of element
self.txt_repeatAlarm.text = [self.arr_repeatAlarm objectAtIndex:self.selectedIndex];
      }

 - (void)dateWasSelected:(NSDate *)selectedDate element:(id)element{ //indexpath:
  (NSIndexPath *)indexpath{
UITextField  * textfield = (UITextField *)element;
if (textfield == self.txt_remindOn) {


      self.selectedDate = selectedDate;
      self.txt_remindOn.text = [self.selectedDate getDateStringInFormat:@"dd MMM yyyy
     hh:mm aa"];
   }

 }


   #pragma mark - TextField Delegate Methods
  - (void)textFieldDidBeginEditing:(UITextField *)textField{
self.txt_currentFocussedTextField = textField;

[[AppDelegate sharedInstance] addToolbarForKeyboard:textField];



if (textField == self.txt_remindOn) {
    [textField resignFirstResponder];
    _actionSheetPicker = [[ActionSheetDatePicker alloc] initWithTitle:@"" 

        datePickerMode:UIDatePickerModeDateAndTime selectedDate:self.selectedDate
        minimumDate:[NSDate
date] maximumDate:Nil target:self action:@selector(dateWasSelected:element:)
      origin:textField];
    self.actionSheetPicker.hideCancel = NO;
    [self.actionSheetPicker showActionSheetPicker];

}

if (textField == self.txt_repeatAlarm) {
    [textField resignFirstResponder];
    [ActionSheetStringPicker showPickerWithTitle:@"" rows:self.arr_repeatAlarm 
    initialSelection:self.selectedIndex target:self 
   successAction:@selector(serviceWasSelected:element:) 
  cancelAction:@selector(actionPickerCancelled:) origin:textField];
}

}




// making the keyboard disappear on pressing the Done button on the keyboard.
- (BOOL)textFieldShouldReturn:(UITextField *)textField {
[textField resignFirstResponder];
return NO;
}

  - (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range
   replacementText:(NSString *)text {

    if([text isEqualToString:@"\n"]) {
    [textView resignFirstResponder];
    return NO;
  }

   return YES;
  }






   - (void)didReceiveMemoryWarning
   {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
   }

  @end

0 个答案:

没有答案