Sign Up

Sign Up to our social questions and Answers Engine to ask questions, answer people’s questions, and connect with other people.

Have an account? Sign In

Have an account? Sign In Now

Sign In

Login to our social questions & Answers Engine to ask questions answer people’s questions & connect with other people.

Sign Up Here

Forgot Password?

Don't have account, Sign Up Here

Forgot Password

Lost your password? Please enter your email address. You will receive a link and will create a new password via email.

Have an account? Sign In Now

You must login to ask a question.

Forgot Password?

Need An Account, Sign Up Here

Please briefly explain why you feel this question should be reported.

Please briefly explain why you feel this answer should be reported.

Please briefly explain why you feel this user should be reported.

Sign InSign Up

The Archive Base

The Archive Base Logo The Archive Base Logo

The Archive Base Navigation

  • Home
  • SEARCH
  • About Us
  • Blog
  • Contact Us
Search
Ask A Question

Mobile menu

Close
Ask a Question
  • Home
  • Add group
  • Groups page
  • Feed
  • User Profile
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Buy Points
  • Users
  • Help
  • Buy Theme
  • SEARCH
Home/ Questions/Q 4037760
In Process

The Archive Base Latest Questions

Editorial Team
  • 0
Editorial Team
Asked: May 20, 20262026-05-20T12:23:19+00:00 2026-05-20T12:23:19+00:00

So below is my code for my controller, which I have four of one

  • 0

So below is my code for my controller, which I have four of one for each tab on the tab bar. I have two issues.

  1. I am getting an array out bounds but I can’t chase it down. Am I missing something here?

  2. Second when my app starts up it take 5 – 8 seconds before it loads the first view of the tab bar. Once it loads and I click another tab, the tab doesn’t turn blue and the app sits there for 3 seconds then finally switches. I am a noob and am struggling here. I think this issue might be fixed by fetching the data in another thread or something? I am sure this controller is full of bugs.

    import "AllMackTableViewController.h"
    import "PostDetailViewController.h"
    import "MackdabMobileAppDelegate.h"
    import <QuartzCore/QuartzCore.h>
    import "Post.h"
    
    define FONT_SIZE 14.0f
    define CELL_CONTENT_WIDTH 254.0f
    define CELL_CONTENT_MARGIN 5.0f
    
    
    
    @implementation AllMackTableViewController
    
    @synthesize jsonArray;
    @synthesize localJsonArray;
    @synthesize postDetailViewController;
    @synthesize allPostsTableView;
    @synthesize fetchedResultsController, managedObjectContext;
    
    
    
    @synthesize minuteTimer;
    @synthesize regionsTimer;
    
    pragma mark 
    pragma mark View lifecycle
    
    
     (void)viewDidLoad {
        [super viewDidLoad];
    
        self.title = NSLocalizedString(@"Feed", @"You're Matching Posts");
    
        UIBarButtonItem *refreshButton = [[UIBarButtonItem alloc]
                                          initWithBarButtonSystemItem:UIBarButtonSystemItemRefresh
                                          target:self
                                          action:@selector(refresh)];
        self.navigationItem.rightBarButtonItem = refreshButton;
        allPostsTableView.delegate = self;
        [refreshButton release];
    
        [self refresh];
    
    
    
    
        // Uncomment the following line to display an Edit button in the navigation bar for this view controller.
        // self.navigationItem.rightBarButtonItem = self.editButtonItem;
    }
    
     (void)scrollViewDidScroll:(UIScrollView *) scrollView;
    {
        CGFloat scrollHeight = scrollView.contentSize.height;
        CGPoint p = scrollView.contentOffset; 
    
        //NSLog(@"x = %f, y = %f", p.x, p.y);
    }
    
    
    
     (void)viewWillAppear:(BOOL)animated {
    
    
        /*
         Set up two timers, one that fires every minute, the other every fifteen minutes.
    
         1/ The time displayed for each time zone must be updated every minute on the minute.
         2/ Time zone data is cached. Some time zones are based on 15 minute differences from GMT, so update the cache every 15 minutes, on the "quarter".
         */
    
        NSTimer *timer;
        NSDate *date = [NSDate date];
    
        /*
         Set up a timer to update the table view every minute on the minute so that it shows the current time.
         */
        NSDate *oneMinuteFromNow = [date dateByAddingTimeInterval:60];
    
        NSCalendarUnit unitFlags = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit;
        NSDateComponents *timerDateComponents = [calendar components:unitFlags fromDate:oneMinuteFromNow];
        // Add 1 second to make sure the minute update has passed when the timer fires.
        [timerDateComponents setSecond:1];
        NSDate *minuteTimerDate = [calendar dateFromComponents:timerDateComponents];
    
        timer = [[NSTimer alloc] initWithFireDate:minuteTimerDate interval:60 target:self selector:@selector(updateTime:) userInfo:nil repeats:YES];
        [[NSRunLoop currentRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode];
        self.minuteTimer = timer;   
        [timer release];
    
    
    
    }
    
    
    
    pragma mark 
    pragma mark Table view data source
    
     (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
        // Return the number of sections.
        return 1;
    }
    
    
     (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
        // Return the number of rows in the section.
       // return [self.localJsonArray count];
    
        NSLog(@"Setting numberOfRowsInSection to %i",[self.localJsonArray count]);
        if ( [jsonArray count] < 9 ) {
            return [self.localJsonArray count];
            NSLog(@"Setting numberOfRowsInSection to %i inside of non add one.",[self.localJsonArray count]);
    
        } else {
            return [self.localJsonArray count] + 1;
        } 
    
    
    }
    
     (void)updateTime:(NSTimer *)timer {
        /*
         To display the current time, redisplay the time labels.
         Don't reload the table view's data as this is unnecessarily expensive  it recalculates the number of cells and the height of each item to determine the total height of the view etc.  The external dimensions of the cells haven't changed, just their contents.
         */
        NSArray *visibleCells = self.tableView.visibleCells;
        for (PostTableCustomCellController *cell in visibleCells) {
            [cell redisplay];
        }
    
        [self updateRegions];
    }
    
    
    
    (NSString *)dateDiff:(NSString *)origDate {
        NSDateFormatter *df = [[NSDateFormatter alloc] init];
        [df setFormatterBehavior:NSDateFormatterBehavior10_4];
        [df setDateFormat:@"EEE, dd MMM yy HH:mm:ss VVVV"];
        NSDate *convertedDate = [df dateFromString:origDate];
        [df release];
        NSDate *todayDate = [NSDate date];
        double ti = [convertedDate timeIntervalSinceDate:todayDate];
        ti = ti * 1;
        if(ti < 1) {
            return @"never";
        } else      if (ti < 60) {
            return @"less than a minute ago";
        } else if (ti < 3600) {
            int diff = round(ti / 60);
            return [NSString stringWithFormat:@"%d minutes ago", diff];
        } else if (ti < 86400) {
            int diff = round(ti / 60 / 60);
            return[NSString stringWithFormat:@"%d hours ago", diff];
        } else if (ti < 2629743) {
            int diff = round(ti / 60 / 60 / 24);
            return[NSString stringWithFormat:@"%d days ago", diff];
        } else {
            return @"never";
        }   
    }
    
    
     (void)updateRegions {
        /*
         The following sets the date for the regions, hence also for the time zone wrappers. This has the sideeffect of "faulting" the time zone wrappers (see TimeZoneWrapper's setDate: method), so can be used to relieve memory pressure.
         */
        NSDate *date = [NSDate date];
        for (Post *post in localJsonArray) {
            post.timeRemaining = [self dateDiff:post.deadline];
        }
    }
    
    
    
    
    // Customize the appearance of table view cells.
     (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
        UILabel *distance;
        UIImage *image = [UIImage imageNamed:@"imageA.png"];
        static NSString *CellIdentifier = @"customCell"; // This is identifier given in IB jason set this.
    
        PostTableCustomCellController *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
        if (indexPath.row != [localJsonArray count] ) {
            if (cell == nil) {
    
                NSLog(@"Cell created");
    
                NSArray *nibObjects = [[NSBundle mainBundle] loadNibNamed:@"PostTableCustomCellController" owner:nil options:nil];
    
                for(id currentObject in nibObjects)
                {
                    if([currentObject isKindOfClass:[PostTableCustomCellController class]])
                    {
                        cell = (PostTableCustomCellController *)currentObject;  
                    }
                }
            }
    
            Post *post = [localJsonArray objectAtIndex:indexPath.row];
    
            NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
            [formatter setDateFormat:@"yyyy"];
    
            //Optionally for time zone converstions
            //[formatter setTimeZone:[NSTimeZone timeZoneWithName:@"..."]];
    
            NSString *stringFromDate = [formatter stringFromDate:post.deadline];
    
            cell.authorName.text = post.author;
            cell.deadline.text = stringFromDate;
            cell.budget.text = post.budget;
            cell.description.text = post.description;
            [[cell avatar] setImage:[UIImage imageNamed:@"butterfly.jpeg"]];
            [stringFromDate release];
    
            NSLog([NSString stringWithFormat:@"%@", post.distance]);
            if([@"" isEqualToString: post.distance] || nil == post.distance) {
                cell.distance.text = @"1 mi.";
            }else{
                cell.distance.text = @"25 mi.";
            }
    
            Post *myPost = [localJsonArray objectAtIndex:[indexPath row]];
    
            // Might can remove these
            UILabel *locationLabel = (UILabel *) [cell distance];
            UITextView *postTextView = (UITextView *) [cell description];
    
            //CGSize maximumLabelSize = CGSizeMake(254,88.0f);
    
            NSString *text;
            CGSize constraint;
            CGSize size;    
            CGFloat height;
            CGFloat realHeight;
            CGSize expectedLabelSize;
    
            text = myPost.description;
    
            constraint = CGSizeMake(CELL_CONTENT_WIDTH  (CELL_CONTENT_MARGIN * 2), 88.0f);
    
            size = [text sizeWithFont:[UIFont systemFontOfSize:FONT_SIZE] constrainedToSize:constraint lineBreakMode:UILineBreakModeWordWrap];
    
            height = MAX(size.height, 35.0f);
    
            realHeight = height + 36.0f  (10); 
    
            expectedLabelSize = [text sizeWithFont:[UIFont boldSystemFontOfSize:18.0f] constrainedToSize:CGSizeMake(252.0f, CGFLOAT_MAX) lineBreakMode:UILineBreakModeWordWrap];
    
            CGRect newFrame = postTextView.frame;
            newFrame.size.height = expectedLabelSize.height;
            newFrame.size.width = 252;
            postTextView.frame = newFrame;
    
    
            [[cell description] sizeToFit];
    
            [[cell viewForBackground] sizeToFit];
            [cell setNeedsDisplay];
    
    
        }// Ok, all done for filling the normal cells, next we probaply reach the +1 index, which doesn’t contain anything yet
    
        if ( [jsonArray count] == 9 ) { // Only call this if the array count is 25
            if(indexPath.row == [localJsonArray count] ) { // Here we check if we reached the end of the index, so the +1 row 
                if (cell == nil) {
                    cell = [[[PostTableCustomCellController alloc] initWithFrame:CGRectZero reuseIdentifier:CellIdentifier] autorelease];
                }
                // Reset previous content of the cell, I have these defined in a UITableCell subclass, change them where needed
                cell.authorName.text = nil;
                cell.deadline.text = nil;
                cell.budget.text = nil;
                cell.description.text = nil;
    
                // Here we create the ‘Load more’ cell
                UILabel *loadMore =[[UILabel alloc]initWithFrame: CGRectMake(20,0,362,100)];
                loadMore.textColor = [UIColor blackColor];
                loadMore.highlightedTextColor = [UIColor darkGrayColor];
                loadMore.backgroundColor = [UIColor clearColor];
                loadMore.font=[UIFont fontWithName:@"Verdana" size:20];
                loadMore.textAlignment=UITextAlignmentCenter;
                loadMore.font=[UIFont boldSystemFontOfSize:20];
                loadMore.text=@"Load More..";
                [cell addSubview:loadMore];
            }
        }
    
        return cell;
    }
    
     (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath;
    {
        if (indexPath.row != [localJsonArray count] ) {
            Post *myPost = [localJsonArray objectAtIndex:[indexPath row]];
            NSString *text = myPost.description;
    
            CGSize constraint = CGSizeMake(CELL_CONTENT_WIDTH  (CELL_CONTENT_MARGIN * 2), 88.0f);
    
            CGSize size = [text sizeWithFont:[UIFont systemFontOfSize:FONT_SIZE] constrainedToSize:constraint lineBreakMode:UILineBreakModeWordWrap];
    
            CGFloat height = MAX(size.height, 35.0f);
    
            return height + (CELL_CONTENT_MARGIN * 2) + 28.0f; 
        }else{
            return 100.0f;
        }
    
    }
    
    (IBAction)nextTwentyFivePlease:(NSString *)thePostID{
        [UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
        self.jsonArray = [Post findNextTwentyFiveRemote:thePostID];
        if (self.localJsonArray == nil) {
            self.localJsonArray = [[NSMutableArray alloc]init]; // init the local array if it’s empty
        }
        [self.localJsonArray addObjectsFromArray:self.jsonArray];
        [self.tableView reloadData];
        [UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
    }
    
    
     (IBAction)refresh {
        [UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
        self.jsonArray = [Post findAllRemote];
        if (self.localJsonArray == nil) {
            self.localJsonArray = [[NSMutableArray alloc]init]; // init the local array if it’s empty
        }
        [self.localJsonArray addObjectsFromArray:self.jsonArray];
    
    
        //self.localJsonArray = [Post findAllRemote];
        [self.tableView reloadData];
        [UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
    }
    
    
    pragma mark 
    pragma mark Table view delegate
    
     (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    
        if ( [jsonArray count] == 9 ) {  // only check for the load more function if we have 25 results in the dynamic array
            if (indexPath.row == [localJsonArray count] ) { // See if we reached the +1 in the results
                Post *tempPost = [jsonArray objectAtIndex:indexPath.row];
                NSLog('What is at tempPost');
                [self nextTwentyFivePlease:tempPost.postID]; // function to load more results
            }
        } else {
            NSInteger row = [indexPath row];
            if (self.postDetailViewController == nil) {
                PostDetailViewController *aPostDetail = [[PostDetailViewController alloc] initWithNibName:@"PostDetailView" bundle:nil];
                self.postDetailViewController = aPostDetail;
                postDetailViewController.post = [localJsonArray objectAtIndex:row];
                [aPostDetail release];
            }
            postDetailViewController.title = [NSString stringWithFormat:@"Details"];
    
            MackdabMobileAppDelegate *delegate = [[UIApplication sharedApplication] delegate]; 
            [delegate.allMacksNavController pushViewController:postDetailViewController animated:YES];
            [tableView deselectRowAtIndexPath:indexPath animated:YES];
        }
    }
    
    
    pragma mark 
    pragma mark Timer set accessor methods
    
     (void)setMinuteTimer:(NSTimer *)newTimer {
    
        if (minuteTimer != newTimer) {
            [minuteTimer invalidate];
            minuteTimer = newTimer;
        }
    }
    
    
     (void)setRegionsTimer:(NSTimer *)newTimer {
    
        if (regionsTimer != newTimer) {
            [regionsTimer invalidate];
            regionsTimer = newTimer;
        }
    }
    
    
    pragma mark 
    pragma mark Memory management
    
     (void)didReceiveMemoryWarning {
        // Releases the view if it doesn't have a superview.
        [super didReceiveMemoryWarning];
    
        // Relinquish ownership any cached data, images, etc that aren't in use.
    }
    
     (void)viewDidUnload {
        // Relinquish ownership of anything that can be recreated in viewDidLoad or on demand.
        // For example: self.myOutlet = nil;
    }
    
    
     (void)dealloc {
        [allPostsTableView release];
        [postDetailViewController release];
        [localJsonArray release]; // may need to remove this
        [super dealloc];
    }
    
    
    @end
    
  • 1 1 Answer
  • 0 Views
  • 0 Followers
  • 0
Share
  • Facebook
  • Report

Leave an answer
Cancel reply

You must login to add an answer.

Forgot Password?

Need An Account, Sign Up Here

1 Answer

  • Voted
  • Oldest
  • Recent
  • Random
  1. Editorial Team
    Editorial Team
    2026-05-20T12:23:20+00:00Added an answer on May 20, 2026 at 12:23 pm

    In your refresh method which is called in viewDidLoad, it appears that it is doing a bunch of network access to download some information. That would explain why it is taking so long to show your initial tab.

    You’ll want to do that network access in a background thread so that your UI doesn’t block. Then once you’ve gotten the results back you can update your UI from the main thread. Something like:

    - (IBAction) refresh {
        [UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
        [self performSelectorInBackground:@selector(refreshInBackground) withObject:nil];
    }
    
    - (void) refreshInBackground {
        NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    
        self.jsonArray = [Post findAllRemote];
        if (self.localJsonArray == nil) {
            self.localJsonArray = [[NSMutableArray alloc]init]; // init the local array if it’s empty
        }
        [self.localJsonArray addObjectsFromArray:self.jsonArray];
    
        [self performSelectorOnMainThread:@selector(refreshComplete) withObject:nil waitUntilDone:NO];
    
    }
    
    - (void) refreshComplete {
        [self.tableView reloadData];
        [UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
    }
    

    EDIT: As Rob noted in the comment below, you’ll want to add some kind of flag (or semaphore) to avoid firing off multiple -refresh calls at the same time. Threading and race conditions are always a tricky bit, but my goal above was just to get you moving in the right direction so that you can use background threads for your network calls.

    • 0
    • Reply
    • Share
      Share
      • Share on Facebook
      • Share on Twitter
      • Share on LinkedIn
      • Share on WhatsApp
      • Report

Sidebar

Related Questions

I have the below code in stdafx.h. using namespace std; typedef struct { DWORD
Okay so I have a scenario similar to the below code, I have a
I have a navigation controller which also has a table view. I want to
Does the code below smell? I'm refactoring some code and have discovered this circular
When running the below code a type is never returned, despite there being a
In the below code snippet can i replace char * to const char *
In the below code sample, what does {0:X2} mean? This is from the reflection
In the below code, the ListBox gets filled with the names of the colors
I would like to know how to modify the below code to strip =20
When retrieving objects from an NSMutableArray in cocoa-touch is the below code ok? Should

Explore

  • Home
  • Add group
  • Groups page
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Users
  • Help
  • SEARCH

Footer

© 2021 The Archive Base. All Rights Reserved
With Love by The Archive Base

Insert/edit link

Enter the destination URL

Or link to existing content

    No search term specified. Showing recent items. Search or use up and down arrow keys to select an item.