Tom Insam

the basic user interface chain loves to show games you can’t actually use without discs, so you’ll go to interact with them because they’re icons, people click on icons, and then it will tell you that you have the wrong disc inserted. So these launch titles are the last discs I’ll be purchasing, ever; the user interface has digital as an assumption, and I see no reason to contravene it

No matter how many times I click “allow” on this dialog, it still comes back. This is because my python binary is badly signed (I assume something in the virtualenv builder mangles it).

$ codesign -vvvv venv/bin/python
venv/bin/python: invalid signature (code or signature have been modified)
In architecture: i386

I can fix this by signing it myself (I have a developer account. Maybe you can use self-signed certificates? Pass).

$ codesign -f -s "iPhone Developer: Tom Insam" venv/bin/python
venv/bin/python: replacing existing signature

And now the firewall “allow” button will stick.

When you first create / get a reference to the navigation controller, set a global custom back image (replaces the chevron) with:

[self.navigationController.navigationBar setBackIndicatorImage:
    [UIImage imageNamed:@"CustomerBackImage"]];
[self.navigationController.navigationBar setBackIndicatorTransitionMaskImage:
    [UIImage imageNamed:@"CustomerBackImage"]];

The title of the back button is owned by the view that it points to, not the current view. You can make it blank by calling

self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc]
    initWithTitle:@""
    style:UIBarButtonItemStylePlain
    target:nil
    action:nil];

in the view that the back button points to. So call it in prepareForSegue or before pushViewController:animated: or something. Setting a view controller’s title programmatically seems to reset it, so set it after setting the title.

You’ll see lots of advice to set self.navigationItem.leftBarButtonItems (which breaks swipe-to-go-back) then mess with interactivePopGestureRecognizer to fix swipe-to-go-back (which has some exciting doesn’t quite work right edge case problems). Don’t do that. Do this.

jaredsinclair:

[..] there is no way to return to iOS 6 style status bar layout logic. In order to approximate this, you have to move all the view controllers of your app into a container view that is offset by 20 points from the top of the screen, leaving an intentionally black view behind the status bar to simulate the old appearance. [..] Apple is pushing very hard to ensure that you don’t try to do [this].

Jared Sinclair: Wrestling with Status Bars and Navigation Bars on iOS 7

Like all of us, I strive to balance addObserver/removeObserver calls in my app to prevent crashes [..] iOS 7 has complicated this pattern. I can no longer rely on a view controller being torn down when viewWillDisappear is called. I have to expect that it might turn around, yell “just kidding,” and proceed to call viewWillAppear/viewDidAppear all over again.

In the matter of reforming things, as distinct from deforming them, there is one plain and simple principle; a principle which will probably be called a paradox. There exists in such a case a certain institution or law; let us say, for the sake of simplicity, a fence or gate erected across a road. The more modern type of reformer goes gaily up to it and says, “I don’t see the use of this; let us clear it away.” To which the more intelligent type of reformer will do well to answer: “If you don’t see the use of it, I certainly won’t let you clear it away. Go away and think. Then, when you can come back and tell me that you do see the use of it, I may allow you to destroy it.

If you’re talking to a google calendar on an iOS device (using the “Gmail account” setting rather than the deprecated “Exchange account”) and you want to see shared calendars, this is the page you should go to.

Google Calendar Sync Settings